omx_vdec.cpp revision 57550cf78d0e21406efd278ad44069674b2e1813
1e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*-------------------------------------------------------------------------- 2826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCopyright (c) 2010-2012, Code Aurora Forum. All rights reserved. 3e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRedistribution and use in source and binary forms, with or without 5e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellymodification, are permitted provided that the following conditions are met: 6e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * Redistributions of source code must retain the above copyright 7e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly notice, this list of conditions and the following disclaimer. 8e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * Redistributions in binary form must reproduce the above copyright 9e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly notice, this list of conditions and the following disclaimer in the 10e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly documentation and/or other materials provided with the distribution. 11e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * Neither the name of Code Aurora nor 12e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly the names of its contributors may be used to endorse or promote 13e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly products derived from this software without specific prior written 14e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly permission. 15e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 16e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 20e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly--------------------------------------------------------------------------*/ 28e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 29e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*============================================================================ 30e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly O p e n M A X w r a p p e r s 31e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly O p e n M A X C o r e 32e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 33e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly*//** @file omx_vdec.cpp 34e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly This module contains the implementation of the OpenMAX core & component. 35e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 36e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly*//*========================================================================*/ 37e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 38e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly////////////////////////////////////////////////////////////////////////////// 39e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Include Files 40e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly////////////////////////////////////////////////////////////////////////////// 41e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 42e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <string.h> 43e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <pthread.h> 44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h> 45e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <stdlib.h> 46e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <unistd.h> 47e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <errno.h> 48e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "omx_vdec.h" 49e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <fcntl.h> 50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <limits.h> 51e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_ 53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h> 54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/mman.h> 55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 56e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <cutils/properties.h> 59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef USE_EGL_IMAGE_GPU 60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <gralloc_priv.h> 64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_ICS_) 67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <genlock.h> 68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "DivXDrmDecrypt.h" 72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h> 76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h> 77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00 78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01 79e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif 80e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0" 83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30 84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1; 85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0"; 86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1; 89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv"; 90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile; 93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata"; 94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 95e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30 97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_NUM_SPS 32 98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_NUM_PPS 256 99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR (MAX_NUM_SPS + MAX_NUM_PPS) 100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120 101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SP_MP_START_CODE 0xC5000000 103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SP_MP_START_CODE_MASK 0xFF000000 104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_AP_SEQ_START_CODE 0x0F010000 105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_C_PROFILE_MASK 0xF0 106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_B_LEVEL_MASK 0xE0000000 107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SIMPLE_PROFILE 0 108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_MAIN_PROFILE 1 109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_ADVANCE_PROFILE 3 110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SIMPLE_PROFILE_LOW_LEVEL 0 111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SIMPLE_PROFILE_MED_LEVEL 2 112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_C_LEN 4 113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_C_POS 8 114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_A_POS 12 115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_STRUCT_B_POS 24 116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define VC1_SEQ_LAYER_SIZE 36 117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev #define MEM_DEVICE "/dev/ion" 120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev #define MEM_HEAP_ID ION_CP_MM_HEAP_ID 121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_720P 122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/pmem_adsp" 123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P_EBI 124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/pmem_adsp" 125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P 126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/pmem_smipool" 127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* 130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_ 131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly extern "C"{ 132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly #include<utils/Log.h> 133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif//_ANDROID_ 135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*/ 136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef DEBUG_PRINT_LOW 138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef DEBUG_PRINT_HIGH 139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef DEBUG_PRINT_ERROR 140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEBUG_PRINT_LOW ALOGV 142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEBUG_PRINT_HIGH ALOGV 143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEBUG_PRINT_ERROR ALOGE 144d31c34204bae71982ed9e5425cb110ebcb176f45Nick Pelly 145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_ 146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <glib.h> 147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define strlcpy g_strlcpy 148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } } 151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); } 152d31c34204bae71982ed9e5425cb110ebcb176f45Nick Pelly 153fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgebool omx_vdec::m_secure_display = false; 154fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid* async_message_thread (void *input) 156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_ioctl_msg ioctl_msg; 158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_msginfo vdec_msg; 159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec *omx = reinterpret_cast<omx_vdec*>(input); 160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int error_code = 0; 161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n"); 162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0); 163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly while (1) 164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = NULL; 166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = (void*)&vdec_msg; 167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Wait for a message from the video decoder driver*/ 168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev error_code = ioctl ( omx->drv_ctx.video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG, 169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg); 170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (error_code == -512) // ERESTARTSYS 171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ERESTARTSYS received in ioctl read next msg!"); 173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (error_code < 0) 175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Error in ioctl read next msg"); 177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } /*Call Instance specific process function*/ 179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (omx->async_message_process(input,&vdec_msg) < 0) 180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Wrong ioctl message"); 182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n"); 185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return NULL; 186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid* message_thread(void *input) 189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec* omx = reinterpret_cast<omx_vdec*>(input); 191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned char id; 192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly int n; 193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("omx_vdec: message thread start\n"); 195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0); 196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly while (1) 197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly n = read(omx->m_pipe_in, &id, 1); 200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(0 == n) 202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (1 == n) 207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx->process_event_cb(omx, id); 209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if ((n < 0) && (errno != EINTR)) 211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR: read from pipe failed, ret %d errno %d", n, errno); 213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n"); 217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return 0; 218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid post_message(omx_vdec *omx, unsigned char id) 221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly int ret_value; 223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out); 224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ret_value = write(omx->m_pipe_out, &id, 1); 225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value); 226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx_cmd_queue destructor 229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::omx_cmd_queue::~omx_cmd_queue() 230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Nothing to do 232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx cmd queue constructor 235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE); 238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx cmd queue insert 241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id) 242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool ret = true; 244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE) 245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_q[m_write].id = id; 247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_q[m_write].param1 = p1; 248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_q[m_write].param2 = p2; 249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_write++; 250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_size ++; 251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) 252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_write = 0; 254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ret = false; 259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__); 260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return ret; 262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// omx cmd queue pop 265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id) 266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool ret = true; 268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_size > 0) 269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly *id = m_q[m_read].id; 271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly *p1 = m_q[m_read].param1; 272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly *p2 = m_q[m_read].param2; 273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Move the read pointer ahead 274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ++m_read; 275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly --m_size; 276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) 277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_read = 0; 279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ret = false; 284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return ret; 286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Retrieve the first mesg type in the queue 289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyunsigned omx_vdec::omx_cmd_queue::get_q_msg_type() 290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return m_q[m_read].id; 292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list() 296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //initialize timestamps array 298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) ); 299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list() 301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //free m_ts_arr_list? 303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts) 306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool ret = true; 308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool duplicate_ts = false; 309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int idx = 0; 310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //insert at the first available empty location 312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_ts_arr_list[idx].valid) 315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //found invalid or empty entry, save timestamp 317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ts_arr_list[idx].valid = true; 318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ts_arr_list[idx].timestamp = ts; 319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ts, idx); 321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) 326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = false; 329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool ret = true; 336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int min_idx = -1; 337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_TICKS min_ts = 0; 338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int idx = 0; 339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_ts_arr_list[idx].valid) 344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //found valid entry, save index 346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (min_idx < 0) 347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //first valid entry 349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev min_ts = m_ts_arr_list[idx].timestamp; 350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev min_idx = idx; 351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (m_ts_arr_list[idx].timestamp < min_ts) 353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev min_ts = m_ts_arr_list[idx].timestamp; 355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev min_idx = idx; 356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (min_idx < 0) 362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //no valid entries found 364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ts = 0; 366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = false; 367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ts = m_ts_arr_list[min_idx].timestamp; 371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ts_arr_list[min_idx].valid = false; 372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ts, min_idx); 374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list() 382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool ret = true; 384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int idx = 0; 385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ts_arr_list[idx].valid = false; 390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// factory function executed by the core to create instances 396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid *get_omx_component_factory_fn(void) 397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return (new omx_vdec); 399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_ 402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base, 404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct ion_handle *handle, int ionMapfd) 405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ion_device_fd = devicefd; 407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ion_handle = handle; 408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev MemoryHeapBase::init(ionMapfd, base, size, 0, MEM_DEVICE); 409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd); 410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 412e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyVideoHeap::VideoHeap(int fd, size_t size, void* base) 413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // dup file descriptor, map once, use pmem 415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev init(dup(fd), base, size, 0 , MEM_DEVICE); 416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif // _ANDROID_ 419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 420e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::omx_vdec 422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 423e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Constructor 425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 426e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None 428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 429e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::omx_vdec(): m_state(OMX_StateInvalid), 433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_app_data(NULL), 434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_inp_mem_ptr(NULL), 435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_mem_ptr(NULL), 436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_phdr_pmem_ptr(NULL), 437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pending_input_buffers(0), 438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pending_output_buffers(0), 439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_bm_count(0), 440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_inp_bm_count(0), 441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_inp_bPopulated(OMX_FALSE), 442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_bPopulated(OMX_FALSE), 443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_flags(0), 444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_inp_bEnabled(OMX_TRUE), 445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_bEnabled(OMX_TRUE), 446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_platform_list(NULL), 447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_platform_entry(NULL), 448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_pmem_info(NULL), 449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_flush_progress (false), 450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_flush_progress (false), 451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input_use_buffer (false), 452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly output_use_buffer (false), 453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly arbitrary_bytes (true), 454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame (NULL), 455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame (NULL), 456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_inp_heap_ptr (NULL), 457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_heap_inp_bm_count (0), 458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly codec_type_parse ((codec_type)0), 459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly first_frame_meta (true), 460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frame_count (0), 461090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly nal_length(0), 462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_count (0), 463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly look_ahead_nal (false), 464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly first_frame(0), 465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly first_buffer(NULL), 466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly first_frame_size (0), 467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_error_propogated(false), 468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_device_file_ptr(NULL), 469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vc1_profile((vc1_profile_type)0), 470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts(LLONG_MAX), 471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts(true), 472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int(0), 473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_in_alloc_cnt(0), 474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_display_id(NULL), 475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ouput_egl_buffers(false), 476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser(NULL), 477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev client_extradata(0), 478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts(LLONG_MAX), 479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_flags(0), 480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_err_count(0), 481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_ptr(NULL), 483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_count(0), 484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_enable_android_native_buffers(OMX_FALSE), 485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_android_native_buffers(OMX_FALSE), 486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev in_reconfig(false), 488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_output_pmem(OMX_FALSE), 489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_region_smi(OMX_FALSE), 490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_pvt_entry_pmem(OMX_FALSE), 491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev secure_mode(false) 492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ,iDivXDrmDecrypt(NULL) 494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ,m_desc_buffer_ptr(NULL) 496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ,m_extradata(NULL) 497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Assumption is that , to begin with , we have all the frames with decoder */ 499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("In OMX vdec Constructor"); 500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev char property_value[PROPERTY_VALUE_MAX] = {0}; 502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_get("vidc.dec.debug.perf", property_value, "0"); 503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev perf_flag = atoi(property_value); 504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (perf_flag) 505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag); 507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.start(); 508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_frms = latency = 0; 509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_value[0] = NULL; 511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_get("vidc.dec.debug.ts", property_value, "0"); 512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_debug_timestamp = atoi(property_value); 513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp); 514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_debug_timestamp) 515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.set_timestamp_reorder_mode(true); 517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.enable_debug_print(true); 518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_value[0] = NULL; 521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_get("vidc.dec.debug.concealedmb", property_value, "0"); 522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_debug_concealedmb = atoi(property_value); 523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb); 524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memset(&m_cmp,0,sizeof(m_cmp)); 527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memset(&m_cb,0,sizeof(m_cb)); 528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset (&drv_ctx,0,sizeof(drv_ctx)); 529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE)); 530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memset (m_hwdevice_name,0,sizeof(m_hwdevice_name)); 531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&op_buf_rcnfg, 0 ,sizeof(vdec_allocatorproperty)); 532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries = 0; 534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.timestamp_adjust = false; 538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_driver_fd = -1; 539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.pData = NULL; 540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_init(&m_lock, NULL); 541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_init(&m_cmd_lock,0,0); 542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev char extradata_value[PROPERTY_VALUE_MAX] = {0}; 544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_get("vidc.dec.debug.extradata", extradata_value, "0"); 545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_debug_extradata = atoi(extradata_value); 546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata); 547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 54840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB; 54940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George client_buffers.set_vdec_client(this); 550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 554e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::~omx_vdec 556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 557e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Destructor 559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 560e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None 562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 563e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyomx_vdec::~omx_vdec() 567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_pmem_info = NULL; 569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("In OMX vdec Destructor"); 570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_pipe_in) close(m_pipe_in); 571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_pipe_out) close(m_pipe_out); 572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_pipe_in = -1; 573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_pipe_out = -1; 574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_join(msg_thread_id,NULL); 576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_join(async_thread_id,NULL); 578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_destroy(&m_lock); 579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_destroy(&m_cmd_lock); 580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (perf_flag) 582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME"); 584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.end(); 585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */ 587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Exit OMX vdec Destructor"); 588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 591e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::OMXCntrlProcessMsgCb 593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 594e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly IL Client callbacks are generated through this routine. The decoder 596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly provides the thread context for this routine. 597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 598e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ctxt -- Context information related to the self. 600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly id -- Event identifier. This could be any of the following: 601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1. Command completion event 602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2. Buffer done callback event 603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3. Frame done callback event 604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 605e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id) 610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned p1; // Parameter - 1 612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned p2; // Parameter - 2 613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned ident; 614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned qsize=0; // qsize 615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec *pThis = (omx_vdec *) ctxt; 616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!pThis) 618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n", 620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly __func__); 621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return; 622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Protect the shared queue data structure 625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly do 626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Read the message id's from the queue*/ 628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_lock(&pThis->m_lock); 629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly qsize = pThis->m_cmd_q.m_size; 630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(qsize) 631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cmd_q.pop_entry(&p1,&p2,&ident); 633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (qsize == 0 && pThis->m_state != OMX_StatePause) 636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly qsize = pThis->m_ftb_q.m_size; 638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (qsize) 639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_ftb_q.pop_entry(&p1,&p2,&ident); 641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 642e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (qsize == 0 && pThis->m_state != OMX_StatePause) 645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly qsize = pThis->m_etb_q.m_size; 647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (qsize) 648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_etb_q.pop_entry(&p1,&p2,&ident); 650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_unlock(&pThis->m_lock); 653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*process message if we have one*/ 655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(qsize > 0) 656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly id = ident; 658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly switch (id) 659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_EVENT: 661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pThis->m_cb.EventHandler) 662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly switch (p1) 664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_CommandStateSet: 666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_state = (OMX_STATETYPE) p2; 667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d", 668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_state); 669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_EventCmdComplete, p1, p2, NULL); 671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_EventError: 674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(p2 == OMX_StateInvalid) 675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid"); 677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_state = (OMX_STATETYPE) p2; 678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (p2 == OMX_ErrorHardware) 682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error(); 684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_EventError, p2, NULL, NULL ); 689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_CommandPortDisable: 693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2); 694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (BITMASK_PRESENT(&pThis->m_flags, 695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) 696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) 701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->in_reconfig = false; 703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->drv_ctx.op_buf = pThis->op_buf_rcnfg; 704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = pThis->set_buffer_req(&pThis->drv_ctx.op_buf); 705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eRet != OMX_ErrorNone) 706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error(); 709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_EventCmdComplete, p1, p2, NULL ); 714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_CommandPortEnable: 716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2); 717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_EventCmdComplete, p1, p2, NULL ); 719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly default: 722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_EventCmdComplete, p1, p2, NULL ); 724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__); 731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_ETB_ARBITRARY: 734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) 736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure"); 738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_ETB: 742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) 744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure"); 746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_FTB: 751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) 753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure"); 755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_COMMAND: 760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_U32)p2,(OMX_PTR)NULL); 762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_EBD: 765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) 767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure"); 769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) 774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_inp_err_count++; 776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->time_stamp_dts.remove_time_stamp( 777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp, 778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ?true:false); 780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_inp_err_count = 0; 784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if ( pThis->empty_buffer_done(&pThis->m_cmp, 786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) 787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n empty_buffer_done failure"); 789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!pThis->arbitrary_bytes && pThis->m_inp_err_count > MAX_INPUT_ERROR) 792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR); 794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: 799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int64_t *timestamp = (int64_t *)p1; 801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p1) 802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->time_stamp_dts.remove_time_stamp(*timestamp, 804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ?true:false); 806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(timestamp); 807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_FBD: 811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (p2 != VDEC_S_SUCCESS) 812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure"); 814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if ( pThis->fill_buffer_done(&pThis->m_cmp, 817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) 818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n fill_buffer_done failure"); 820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete"); 826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!pThis->input_flush_progress) 827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver"); 829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->execute_input_flush(); 833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) 834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS) 836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if we need generate event for Flush done*/ 843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&pThis->m_flags, 844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_INPUT_FLUSH_PENDING)) 845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client"); 848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete,OMX_CommandFlush, 850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX,NULL ); 851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (BITMASK_PRESENT(&pThis->m_flags, 853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_IDLE_PENDING)) 854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!pThis->output_flush_progress) 856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Output flush done hence issue stop"); 858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (pThis->drv_ctx.video_driver_fd, 859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_IOCTL_CMD_STOP,NULL ) < 0) 860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed"); 862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete"); 877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!pThis->output_flush_progress) 878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver"); 880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->execute_output_flush(); 884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) 885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS) 887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if we need generate event for Flush done*/ 894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&pThis->m_flags, 895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) 896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Notify Output Flush done"); 898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete,OMX_CommandFlush, 901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&pThis->m_flags, 904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) 905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Internal flush complete"); 907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR (&pThis->m_flags, 908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (BITMASK_PRESENT(&pThis->m_flags, 910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) 911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->post_event(OMX_CommandPortDisable, 913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_OUTPUT_PORT_INDEX, 914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR (&pThis->m_flags, 916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) 922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!pThis->input_flush_progress) 924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Input flush done hence issue stop"); 926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (pThis->drv_ctx.video_driver_fd, 927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_IOCTL_CMD_STOP,NULL ) < 0) 928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed"); 930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_START_DONE: 944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE"); 945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pThis->m_cb.EventHandler) 947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (p2 != VDEC_S_SUCCESS) 949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure"); 951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success"); 956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) 957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Move to executing"); 959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Send the callback now 960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_state = OMX_StateExecuting; 962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_EventCmdComplete,OMX_CommandStateSet, 964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_StateExecuting, NULL); 965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (BITMASK_PRESENT(&pThis->m_flags, 967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_PAUSE_PENDING)) 968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (pThis->drv_ctx.video_driver_fd, 970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly VDEC_IOCTL_CMD_PAUSE,NULL ) < 0) 971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed"); 973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Event Handler callback is NULL"); 981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_PAUSE_DONE: 985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pThis->m_cb.EventHandler) 987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (p2 != VDEC_S_SUCCESS) 989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->complete_pending_buffer_done_cbs(); 996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) 997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly //Send the callback now 1000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 1001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_state = OMX_StatePause; 1002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_EventCmdComplete,OMX_CommandStateSet, 1004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_StatePause, NULL); 1005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 1014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_RESUME_DONE: 1016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 1017e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pThis->m_cb.EventHandler) 1018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (p2 != VDEC_S_SUCCESS) 1020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 1022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 1023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1025e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1026e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) 1027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Moving the decoder to execute state"); 1029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Send the callback now 1030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 1031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_state = OMX_StateExecuting; 1032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_EventCmdComplete,OMX_CommandStateSet, 1034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_StateExecuting,NULL); 1035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 1044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_STOP_DONE: 1046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 1047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pThis->m_cb.EventHandler) 1048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (p2 != VDEC_S_SUCCESS) 1050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 1052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 1053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->complete_pending_buffer_done_cbs(); 1057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) 1058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success"); 1060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Send the callback now 1061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 1062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_state = OMX_StateIdle; 1063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Move to Idle State"); 1064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 1065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete,OMX_CommandStateSet, 1066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_StateIdle,NULL); 1067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 1076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 1078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG"); 1079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->start_port_reconfig() != OMX_ErrorNone) 1080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error(); 1081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->in_reconfig) 1084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) { 1086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventPortSettingsChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL ); 1088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 1093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1; 1095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged; 1096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 1097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev format = OMX_InterlaceInterleaveFrameTopFieldFirst; 1098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 1099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev format = OMX_InterlaceInterleaveFrameBottomFieldFirst; 1100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else //unsupported interlace format; raise a error 1101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev event = OMX_EventError; 1102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) { 1103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev event, format, 0, NULL ); 1105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 1111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_EOS_DONE: 1113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 1114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) { 1115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 1116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 1117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->prev_ts = LLONG_MAX; 1121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->rst_prev_ts = true; 1122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 1123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 1125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 1126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pThis->omx_report_error (); 1127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 1128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG: 1129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG"); 1131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) { 1132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL ); 1134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly default: 1139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 1140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_lock(&pThis->m_lock); 1143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev qsize = pThis->m_cmd_q.m_size; 1144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_state != OMX_StatePause) 1145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 1146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_unlock(&pThis->m_lock); 1147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly while(qsize>0); 1149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 1151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 1155e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 1156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::ComponentInit 1157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1158e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 1159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Initialize the component. 1160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1161e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 1162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ctxt -- Context information related to the self. 1163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly id -- Event identifier. This could be any of the following: 1164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1. Command completion event 1165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2. Buffer done callback event 1166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3. Frame done callback event 1167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1168e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 1169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 1170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 1172e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) 1173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 1174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 1176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 1177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned int alignment = 0,buffer_size = 0; 1178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly int fds[2]; 1179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly int r; 1180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_STRING device_name = "/dev/msm_vidc_dec"; 1181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)){ 1183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev secure_mode = true; 1184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev arbitrary_bytes = false; 1185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev role = "OMX.qcom.video.decoder.avc"; 1186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev device_name = "/dev/msm_vidc_dec_sec"; 1187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1188fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 1189fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (secure_mode) { 1190fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (secureDisplay(qService::IQService::START) < 0) { 1191fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George DEBUG_PRINT_HIGH("Sending message to start securing display failed"); 1192fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 1193fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 1194fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 1195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Start of New Playback : role = %s : DEVICE = %s", 1196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev role, device_name); 1197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK); 1199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d", 1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_driver_fd, errno); 1202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.video_driver_fd == 0){ 1204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK); 1205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.video_driver_fd < 0) 1208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno); 1210fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George eRet = OMX_ErrorInsufficientResources; 1211fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George goto cleanup; 1212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 1214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_denominator = 1; 1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcpy(inputfilename, INPUT_BUFFER_FILE_NAME); 1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 1221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev outputBufferFile1 = fopen (outputfilename, "ab"); 1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 1224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev outputExtradataFile = fopen (ouputextradatafilename, "ab"); 1225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif 1226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Copy the role information which provides the decoder kind 1228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy(drv_ctx.kind,role,128); 1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\ 1230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_MAX_STRINGNAME_SIZE)) 1231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.mpeg4",\ 1233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_MAX_STRINGNAME_SIZE); 1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.timestamp_adjust = true; 1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4; 1236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eCompressionFormat = OMX_VIDEO_CodingMPEG4; 1237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Initialize Start Code for MPEG4*/ 1238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly codec_type_parse = CODEC_TYPE_MPEG4; 1239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_frame_parser.init_start_codes (codec_type_parse); 1240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "m4v"); 1242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\ 1245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.mpeg2",\ 1248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE); 1249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2; 1250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = OMX_VIDEO_CodingMPEG2; 1251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Initialize Start Code for MPEG2*/ 1252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_MPEG2; 1253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "mpg"); 1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\ 1259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_MAX_STRINGNAME_SIZE)) 1260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 1262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n H263 Decoder selected"); 1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_H263; 1264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eCompressionFormat = OMX_VIDEO_CodingH263; 1265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly codec_type_parse = CODEC_TYPE_H263; 1266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_frame_parser.init_start_codes (codec_type_parse); 1267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "263"); 1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 1272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\ 1273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_MAX_STRINGNAME_SIZE)) 1274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 1276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected"); 1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3; 1278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 1279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_DIVX; 1280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 1282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE err = createDivxDrmContext(); 1283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( err != OMX_ErrorNone ) { 1284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 1285fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George eRet = err; 1286fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George goto cleanup; 1287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 1289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ 1291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_MAX_STRINGNAME_SIZE)) 1292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 1294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected"); 1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4; 1296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 1297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_DIVX; 1298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 1300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE err = createDivxDrmContext(); 1301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( err != OMX_ErrorNone ) { 1302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 1303fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George eRet = err; 1304fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George goto cleanup; 1305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 1307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\ 1309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 1312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected"); 1313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6; 1314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 1315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_DIVX; 1316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 1318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE err = createDivxDrmContext(); 1319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( err != OMX_ErrorNone ) { 1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 1321fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George eRet = err; 1322fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George goto cleanup; 1323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 1325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 1327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ 1328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) || (!strncmp(drv_ctx.kind, \ 1329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE))) 1330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 1332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR ("\n DIVX Decoder selected"); 1333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_5; 1334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 1335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_DIVX; 1336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE err = createDivxDrmContext(); 1340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( err != OMX_ErrorNone ) { 1341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 1342fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George eRet = err; 1343fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George goto cleanup; 1344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 1346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\ 1349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 1352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_H264; 1353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = OMX_VIDEO_CodingAVC; 1354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_H264; 1355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_nal_length(nal_length); 1357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "264"); 1359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\ 1362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 1365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_VC1; 1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = OMX_VIDEO_CodingWMV; 1367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_VC1; 1368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "vc1"); 1371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\ 1374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 1377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV; 1378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = OMX_VIDEO_CodingWMV; 1379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_VC1; 1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "vc1"); 1383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n"); 1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInvalidComponentName; 1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev inputBufferFile1 = fopen (inputfilename, "ab"); 1392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (eRet == OMX_ErrorNone) 1394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P 1396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.output_format = VDEC_YUV_FORMAT_NV12; 1397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 1400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.output_format = VDEC_YUV_FORMAT_TILE_4x2; 140140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE) 140240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka; 140340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!client_buffers.set_color_format(dest_color_format)) { 140440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Setting color format failed"); 140540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George eRet = OMX_ErrorInsufficientResources; 140640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 1407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Initialize Decoder with codec type and resolution*/ 1409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.decoder_format; 1410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 1411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if ( (eRet == OMX_ErrorNone) && 1413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_CODEC, 1414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (void*)&ioctl_msg) < 0) 1415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Set codec type failed"); 1418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInsufficientResources; 1419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Set the output format*/ 1422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.output_format; 1423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 1424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if ( (eRet == OMX_ErrorNone) && 1426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT, 1427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (void*)&ioctl_msg) < 0) 1428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Set output format failed"); 1430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInsufficientResources; 1431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef MAX_RES_720P 1434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_height = 1435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.scan_lines = 720; 1436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width = 1437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.stride = 1280; 1438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif 1439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef MAX_RES_1080P 1440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_height = 1441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.scan_lines = 1088; 1442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width = 1443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.stride = 1920; 1444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif 1445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.video_resolution; 1447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 1448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if ( (eRet == OMX_ErrorNone) && 1450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_PICRES, 1451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (void*)&ioctl_msg) < 0) 1452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Set Resolution failed"); 1454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInsufficientResources; 1455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Get the Buffer requirements for input and output ports*/ 1458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT; 1459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 1460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.extradata = 0; 1462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.picture_order = VDEC_ORDER_DISPLAY; 1463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.idr_only_decoding = 0; 1464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) 1466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = get_buffer_req(&drv_ctx.ip_buf); 1467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) 1468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = get_buffer_req(&drv_ctx.op_buf); 1469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_state = OMX_StateLoaded; 1470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA 1471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone && !secure_mode) 1472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(DEFAULT_EXTRADATA); 1473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( (codec_type_parse == CODEC_TYPE_VC1) || 1475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (codec_type_parse == CODEC_TYPE_H264)) //add CP check here 1476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //Check if dmx can be disabled 1478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 1479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 1480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = &drv_ctx.disable_dmx; 1481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT, &ioctl_msg)) 1482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT"); 1484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 1485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.disable_dmx && !secure_mode) 1489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("DMX disable is supported"); 1491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc = ioctl(drv_ctx.video_driver_fd, 1493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_IOCTL_SET_DISABLE_DMX); 1494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(rc < 0) { 1495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to disable dmx on driver."); 1496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.disable_dmx = false; 1497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 1498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 1501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.disable_dmx = false; 1502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 1506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.mutils == NULL) 1508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils = new H264_Utils(); 1510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.mutils == NULL) 1512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n parser utils Allocation failed "); 1514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 1515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size; 1519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size); 1520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 1521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nOffset = 0; 1522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (h264_scratch.pBuffer == NULL) 1524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed "); 1526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 1527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->initialize_frame_checking_environment(); 1529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size); 1530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser = new h264_stream_parser(); 1534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!h264_parser) 1535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!"); 1537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 1538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(pipe(fds)) 1542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("pipe creation failed\n"); 1544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInsufficientResources; 1545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1548e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly int temp1[2]; 1549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(fds[0] == 0 || fds[1] == 0) 1550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pipe (temp1)) 1552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("pipe creation failed\n"); 1554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInsufficientResources; 1555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly //close (fds[0]); 1557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly //close (fds[1]); 1558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly fds[0] = temp1 [0]; 1559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly fds[1] = temp1 [1]; 1560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_pipe_in = fds[0]; 1562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_pipe_out = fds[1]; 1563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly r = pthread_create(&msg_thread_id,0,message_thread,this); 1564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(r < 0) 1566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed"); 1568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInsufficientResources; 1569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly r = pthread_create(&async_thread_id,0,async_message_thread,this); 1573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(r < 0) 1574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n component_init(): async_message_thread creation failed"); 1576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInsufficientResources; 1577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (eRet != OMX_ErrorNone) 1583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Component Init Failed"); 1585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG"); 1586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 1587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NULL); 1588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n Calling close() on Video Driver"); 1589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close (drv_ctx.video_driver_fd); 1590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_driver_fd = -1; 1591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success"); 1595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer)); 1598fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 1599fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgecleanup: 1600fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 1601fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (secure_mode && (eRet == OMX_ErrorNone)) { 1602fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (secureDisplay(qService::IQService::END) < 0) { 1603fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George DEBUG_PRINT_HIGH("sending message to stop securing display failed"); 1604fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 1605fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 1606fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 1607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 1608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 1609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 1611e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 1612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::GetComponentVersion 1613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1614e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 1615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Returns the component version. 1616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1617e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 1618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly TBD. 1619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1620e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 1621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ErrorNone. 1622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 1624e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::get_component_version 1625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ( 1626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_HANDLETYPE hComp, 1627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT OMX_STRING componentName, 1628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT OMX_VERSIONTYPE* componentVersion, 1629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT OMX_VERSIONTYPE* specVersion, 1630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT OMX_UUIDTYPE* componentUUID 1631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ) 1632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 1633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateInvalid) 1634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n"); 1636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInvalidState; 1637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* TBD -- Return the proper version */ 1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (specVersion) 1640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev specVersion->nVersion = OMX_SPEC_VERSION; 1642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 1644e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 1645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 1646e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 1647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::SendCommand 1648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1649e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 1650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Returns zero if all the buffers released.. 1651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1652e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 1653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 1654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1655e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 1656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 1657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 1659e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp, 1660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_COMMANDTYPE cmd, 1661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 param1, 1662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR cmdData 1663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ) 1664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 1665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client"); 1666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateInvalid) 1667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n"); 1669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInvalidState; 1670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 1672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) 1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush " 1675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "to invalid port: %d", param1); 1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadPortIndex; 1677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 1679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_wait(&m_cmd_lock); 1680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n send_command: Command Processed\n"); 1681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 1682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 1683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 1685e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 1686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::SendCommand 1687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1688e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 1689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Returns zero if all the buffers released.. 1690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1691e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 1692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 1693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1694e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 1695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 1696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 1698e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 1699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_COMMANDTYPE cmd, 1700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 param1, 1701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR cmdData 1702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ) 1703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 1704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 1705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_STATETYPE eState = (OMX_STATETYPE) param1; 1706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int bFlag = 1,sem_posted = 0; 1707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd); 1709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d", 1710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_state, eState); 1711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(cmd == OMX_CommandStateSet) 1713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued"); 1715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState); 1716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /***************************/ 1717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Current State is Loaded */ 1718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /***************************/ 1719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateLoaded) 1720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(eState == OMX_StateIdle) 1722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly //if all buffers are allocated or all ports disabled 1724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(allocate_done() || 1725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) 1726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n"); 1728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n"); 1732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 1733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Skip the event notification 1734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 1735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Loaded to Loaded */ 1738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateLoaded) 1739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n"); 1741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorSameState,\ 1742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorSameState; 1744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Loaded to WaitForResources */ 1746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateWaitForResources) 1747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Since error is None , we will post an event 1749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly at the end of this function definition */ 1750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n"); 1751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Loaded to Executing */ 1753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateExecuting) 1754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n"); 1756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorIncorrectStateTransition; 1759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Loaded to Pause */ 1761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StatePause) 1762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n"); 1764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorIncorrectStateTransition; 1767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Loaded to Invalid */ 1769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateInvalid) 1770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n"); 1772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 1773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInvalidState; 1774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\ 1778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eState); 1779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadParameter; 1780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /***************************/ 1784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Current State is IDLE */ 1785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /***************************/ 1786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(m_state == OMX_StateIdle) 1787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(eState == OMX_StateLoaded) 1789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(release_done()) 1791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* 1793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Since error is None , we will post an event at the end 1794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly of this function definition 1795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly */ 1796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n"); 1797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n"); 1801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 1802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Skip the event notification 1803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 1804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Idle to Executing */ 1807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateExecuting) 1808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 1810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 1811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 1812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START, 1813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NULL) < 0) 1814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED"); 1816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_report_error (); 1817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 1818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Idle to Idle */ 1821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateIdle) 1822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n"); 1824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorSameState,\ 1825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorSameState; 1827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Idle to WaitForResources */ 1829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateWaitForResources) 1830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n"); 1832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorIncorrectStateTransition; 1835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Idle to Pause */ 1837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StatePause) 1838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*To pause the Video core we need to start the driver*/ 1840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START, 1841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NULL) < 0) 1842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED"); 1844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_report_error (); 1845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorHardware; 1846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 1850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n"); 1851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 1852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Idle to Invalid */ 1855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateInvalid) 1856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n"); 1858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 1859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInvalidState; 1860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState); 1864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadParameter; 1865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 1868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /******************************/ 1869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Current State is Executing */ 1870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /******************************/ 1871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(m_state == OMX_StateExecuting) 1872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting"); 1874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Executing to Idle */ 1875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(eState == OMX_StateIdle) 1876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Since error is None , we will post an event 1878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly at the end of this function definition 1879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly */ 1880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n"); 1881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 1882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!sem_posted) 1883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_posted = 1; 1885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_post (&m_cmd_lock); 1886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly execute_omx_flush(OMX_ALL); 1887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 1889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Executing to Paused */ 1891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StatePause) 1892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n PAUSE Command Issued"); 1894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_PAUSE, 1895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NULL) < 0) 1896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Error In Pause State"); 1898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorHardware,\ 1899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorHardware; 1901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1902e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1903e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1904e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 1905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Executing-->Pause\n"); 1906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 1907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Executing to Loaded */ 1910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateLoaded) 1911e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n"); 1913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1914e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorIncorrectStateTransition; 1916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Executing to WaitForResources */ 1918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateWaitForResources) 1919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1920e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n"); 1921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorIncorrectStateTransition; 1924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Executing to Executing */ 1926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateExecuting) 1927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n"); 1929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorSameState,\ 1930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorSameState; 1932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Executing to Invalid */ 1934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateInvalid) 1935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n"); 1937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 1938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInvalidState; 1939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState); 1943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadParameter; 1944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /***************************/ 1947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Current State is Pause */ 1948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /***************************/ 1949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(m_state == OMX_StatePause) 1950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Pause to Executing */ 1952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(eState == OMX_StateExecuting) 1953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Pause --> Executing \n"); 1955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_RESUME, 1956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NULL) < 0) 1957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_RESUME failed"); 1959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorHardware,\ 1960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorHardware; 1962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 1964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING); 1966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 1967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event (NULL,VDEC_S_SUCCESS,\ 1968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_RESUME_DONE); 1969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 1970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Pause to Idle */ 1973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateIdle) 1974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Since error is None , we will post an event 1976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly at the end of this function definition */ 1977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Pause --> Idle \n"); 1978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 1979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!sem_posted) 1980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_posted = 1; 1982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_post (&m_cmd_lock); 1983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly execute_omx_flush(OMX_ALL); 1984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 1986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Pause to loaded */ 1988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateLoaded) 1989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Pause --> loaded \n"); 1991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 1993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorIncorrectStateTransition; 1994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 1995e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Pause to WaitForResources */ 1996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateWaitForResources) 1997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 1998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n"); 1999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 2001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorIncorrectStateTransition; 2002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Pause to Pause */ 2004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StatePause) 2005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Pause --> Pause \n"); 2007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorSameState,\ 2008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 2009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorSameState; 2010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from Pause to Invalid */ 2012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateInvalid) 2013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Pause --> Invalid \n"); 2015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 2016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInvalidState; 2017e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2018e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2019e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState); 2021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadParameter; 2022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /***************************/ 2025e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Current State is WaitForResources */ 2026e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /***************************/ 2027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(m_state == OMX_StateWaitForResources) 2028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from WaitForResources to Loaded */ 2030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(eState == OMX_StateLoaded) 2031e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Since error is None , we will post an event 2033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly at the end of this function definition */ 2034e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n"); 2035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from WaitForResources to WaitForResources */ 2037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (eState == OMX_StateWaitForResources) 2038e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n"); 2040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorSameState, 2041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 2042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorSameState; 2043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2044e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from WaitForResources to Executing */ 2045e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateExecuting) 2046e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2047e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n"); 2048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2049e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 2050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorIncorrectStateTransition; 2051e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2052e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from WaitForResources to Pause */ 2053e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StatePause) 2054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n"); 2056e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 2058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorIncorrectStateTransition; 2059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from WaitForResources to Invalid */ 2061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(eState == OMX_StateInvalid) 2062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n"); 2064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 2065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInvalidState; 2066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Requesting transition from WaitForResources to Loaded - 2068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly is NOT tested by Khronos TS */ 2069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2073e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState); 2074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadParameter; 2075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2077e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /********************************/ 2078e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Current State is Invalid */ 2079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*******************************/ 2080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(m_state == OMX_StateInvalid) 2081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* State Transition from Inavlid to any state */ 2083e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(eState == (OMX_StateLoaded || OMX_StateWaitForResources 2084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly || OMX_StateIdle || OMX_StateExecuting 2085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly || OMX_StatePause || OMX_StateInvalid)) 2086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n"); 2088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError,OMX_ErrorInvalidState,\ 2089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 2090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInvalidState; 2091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (cmd == OMX_CommandFlush) 2094e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2095e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued" 2096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly "with param1: %d", param1); 2097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) 2098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 2100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) 2102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 2104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (!sem_posted){ 2106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_posted = 1; 2107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Set the Semaphore"); 2108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_post (&m_cmd_lock); 2109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly execute_omx_flush(param1); 2110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 2112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if ( cmd == OMX_CommandPortEnable) 2114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued" 2116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly "with param1: %d", param1); 2117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) 2118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_inp_bEnabled = OMX_TRUE; 2120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if( (m_state == OMX_StateLoaded && 2122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 2123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly || allocate_input_done()) 2124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 2126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 2127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n"); 2131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 2132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Skip the event notification 2133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 2134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) 2137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Enable output Port command recieved"); 2139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_bEnabled = OMX_TRUE; 2140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if( (m_state == OMX_StateLoaded && 2142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 2143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly || (allocate_output_done())) 2144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 2146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 2147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n"); 2152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 2153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Skip the event notification 2154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 2155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (cmd == OMX_CommandPortDisable) 2159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued" 2161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly "with param1: %d", param1); 2162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) 2163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_inp_bEnabled = OMX_FALSE; 2165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 2166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly && release_input_done()) 2167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 2169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 2170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 2174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting) 2175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!sem_posted) 2177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_posted = 1; 2179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_post (&m_cmd_lock); 2180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 2182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Skip the event notification 2185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 2186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) 2189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_bEnabled = OMX_FALSE; 2191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Disable output Port command recieved"); 2192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 2193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly && release_output_done()) 2194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 2196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 2197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 2201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting) 2202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!sem_posted) 2204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_posted = 1; 2206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_post (&m_cmd_lock); 2207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 2209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 2210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Skip the event notification 2212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bFlag = 0; 2213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd); 2220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorNotImplemented; 2221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(eRet == OMX_ErrorNone && bFlag) 2223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 2225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!sem_posted) 2227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sem_post(&m_cmd_lock); 2229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 2232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 2233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 2235e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 2236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::ExecuteOmxFlush 2237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2238e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 2239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Executes the OMX flush. 2240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2241e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 2242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly flushtype - input flush(1)/output flush(0)/ both. 2243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2244e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 2245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 2246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 2248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::execute_omx_flush(OMX_U32 flushType) 2249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 2250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 2251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev enum vdec_bufferflush flush_dir; 2252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet = false; 2253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch (flushType) 2254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_CORE_INPUT_PORT_INDEX: 2256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_flush_progress = true; 2257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev flush_dir = VDEC_FLUSH_TYPE_INPUT; 2258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_CORE_OUTPUT_PORT_INDEX: 2260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_flush_progress = true; 2261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev flush_dir = VDEC_FLUSH_TYPE_OUTPUT; 2262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 2264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_flush_progress = true; 2265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_flush_progress = true; 2266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev flush_dir = VDEC_FLUSH_TYPE_ALL; 2267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &flush_dir; 2269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 2270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_CMD_FLUSH, &ioctl_msg) < 0) 2271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", (int)flush_dir); 2273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = false; 2274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 2276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 2277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*========================================================================= 2278e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION : execute_output_flush 2279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2280e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 2281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Executes the OMX flush at OUTPUT PORT. 2282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2283e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 2284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 2285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2286e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 2287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 2288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly==========================================================================*/ 2289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush() 2290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 2291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned p1 = 0; // Parameter - 1 2292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned p2 = 0; // Parameter - 2 2293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned ident = 0; 2294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet = true; 2295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Generate FBD for all Buffers in the FTBq*/ 2297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_lock(&m_lock); 2298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Initiate Output Flush"); 2299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly while (m_ftb_q.m_size) 2300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d", 2302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_ftb_q.m_size,pending_output_buffers); 2303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_ftb_q.pop_entry(&p1,&p2,&ident); 2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2); 230540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if(ident == m_fill_output_msg) 2306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pending_output_buffers++; 230840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 2309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (ident == OMX_COMPONENT_GENERATE_FBD) 2311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 2313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_unlock(&m_lock); 2316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_flush_progress = false; 2317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 2319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = LLONG_MAX; 2321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts = true; 2322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers); 2324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 2325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 2326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*========================================================================= 2327e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION : execute_input_flush 2328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2329e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 2330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Executes the OMX flush at INPUT PORT. 2331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2332e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 2333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 2334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2335e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 2336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 2337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly==========================================================================*/ 2338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush() 2339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 2340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned i =0; 2341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned p1 = 0; // Parameter - 1 2342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned p2 = 0; // Parameter - 2 2343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned ident = 0; 2344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet = true; 2345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Generate EBD for all Buffers in the ETBq*/ 2347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Initiate Input Flush \n"); 2348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_lock(&m_lock); 2350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Check if the Queue is empty \n"); 2351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly while (m_etb_q.m_size) 2352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_etb_q.pop_entry(&p1,&p2,&ident); 2354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) 2356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 2358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 2359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2360e77c68a64ef47b33ae1ae6f5a45152420336b36aHaynes Mathew George else if(ident == OMX_COMPONENT_GENERATE_ETB) 2361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pending_input_buffers++; 2363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 2364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 2365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 2366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (ident == OMX_COMPONENT_GENERATE_EBD) 2368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p", 2370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_BUFFERHEADERTYPE *)p1); 2371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 2372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.flush_timestamp(); 2375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Check if Heap Buffers are to be flushed*/ 2376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes && !(codec_config_flag)) 2377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Reset all the variables before flusing"); 2379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly h264_scratch.nFilledLen = 0; 2380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly nal_count = 0; 2381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly look_ahead_nal = false; 2382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frame_count = 0; 2383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts = LLONG_MAX; 2384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_flags = 0; 2385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 2386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries = 0; 2387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Initialize parser"); 2388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_frame_parser.mutils) 2389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_frame_parser.mutils->initialize_frame_checking_environment(); 2391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly while (m_input_pending_q.m_size) 2394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_input_pending_q.pop_entry(&p1,&p2,&ident); 2396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1); 2397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (psource_frame) 2400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame); 2402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame = NULL; 2403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pdest_frame) 2406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen = 0; 2408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL); 2409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame = NULL; 2410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_frame_parser.flush(); 2412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (codec_config_flag) 2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer " 2416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "is not sent to the driver yet"); 2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_unlock(&m_lock); 2419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_flush_progress = false; 2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!arbitrary_bytes) 2421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = LLONG_MAX; 2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts = true; 2424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_debug_timestamp) 2427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_timestamp_list.reset_ts_list(); 2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers); 2432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 2433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 2434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 2437e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 2438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::SendCommandEvent 2439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2440e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 2441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Send the event to decoder pipe. This is needed to generate the callbacks 2442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly in decoder thread context. 2443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2444e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 2445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 2446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2447e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 2448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 2449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 2451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::post_event(unsigned int p1, 2452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned int p2, 2453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned int id) 2454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 2455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet = false; 2456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_lock(&m_lock); 2459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 246040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (id == m_fill_output_msg || 2461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev id == OMX_COMPONENT_GENERATE_FBD) 2462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_ftb_q.insert_entry(p1,p2,id); 2464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (id == OMX_COMPONENT_GENERATE_ETB || 2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev id == OMX_COMPONENT_GENERATE_EBD || 2467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) 2468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_etb_q.insert_entry(p1,p2,id); 2470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cmd_q.insert_entry(p1,p2,id); 2474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet = true; 2477e77c68a64ef47b33ae1ae6f5a45152420336b36aHaynes Mathew George DEBUG_PRINT_LOW("\n Value of this pointer in post_event 0x%x", p2); 2478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_message(this, id); 2479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pthread_mutex_unlock(&m_lock); 2481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 2483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 2484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P 2485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 2486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!profileLevelType) 2489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(profileLevelType->nPortIndex == 0) { 2492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) 2493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 2497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_AVCLevel31; 2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (profileLevelType->nProfileIndex == 1) 2501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 2503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_AVCLevel31; 2504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(profileLevelType->nProfileIndex == 2) 2506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 2508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_AVCLevel31; 2509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", 2513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->nProfileIndex); 2514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) 2517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 2521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_H263Level70; 2522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex); 2526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) 2530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 2534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 2535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(profileLevelType->nProfileIndex == 1) 2537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 2539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex); 2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex); 2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 2552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 2558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!profileLevelType) 2561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(profileLevelType->nPortIndex == 0) { 2564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) 2565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 2569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 2570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (profileLevelType->nProfileIndex == 1) 2573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 2575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 2576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(profileLevelType->nProfileIndex == 2) 2578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 2580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 2581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", 2585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->nProfileIndex); 2586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) 2590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_H263Level70; 2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex); 2599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) 2603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 2607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 2608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(profileLevelType->nProfileIndex == 1) 2610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 2612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 2613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex); 2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) 2621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple; 2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 2626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(profileLevelType->nProfileIndex == 1) 2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain; 2630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 2631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex); 2635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex); 2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 2643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 2649e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 2650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::GetParameter 2651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2652e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 2653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Get Parameter method implementation 2654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2655e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 2656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 2657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2658e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 2659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Error None if successful. 2660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 2662e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 2663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_INDEXTYPE paramIndex, 2664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_INOUT OMX_PTR paramData) 2665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 2666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 2667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: \n"); 2669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateInvalid) 2670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Get Param in Invalid State\n"); 2672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInvalidState; 2673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(paramData == NULL) 2675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("Get Param in Invalid paramData \n"); 2677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 2678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly switch(paramIndex) 2680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamPortDefinition: 2682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 2685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n"); 2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = update_portdef(portDefn); 2687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) 2688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_port_def = *portDefn; 2689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamVideoInit: 2692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PORT_PARAM_TYPE *portParamType = 2694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_PORT_PARAM_TYPE *) paramData; 2695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n"); 2696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 2698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portParamType->nSize = sizeof(portParamType); 2699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portParamType->nPorts = 2; 2700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portParamType->nStartPortNumber = 0; 2701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamVideoPortFormat: 2704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 2706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 2707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n"); 2708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 2710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portFmt->nSize = sizeof(portFmt); 2711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (0 == portFmt->nPortIndex) 2713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (0 == portFmt->nIndex) 2715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portFmt->eColorFormat = OMX_COLOR_FormatUnused; 2717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portFmt->eCompressionFormat = eCompressionFormat; 2718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 2722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly " NoMore compression formats\n"); 2723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorNoMore; 2724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (1 == portFmt->nPortIndex) 2727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 2729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P 2730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (0 == portFmt->nIndex) 2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 2732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(1 == portFmt->nIndex) 2733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE) 2734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka; 2735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(0 == portFmt->nIndex) 2738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE) 2739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka; 2740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 274140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George else if (1 == portFmt->nIndex) { 274240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar; 274340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 2744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 2747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly " NoMore Color formats\n"); 2748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorNoMore; 2749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n", 2754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (int)portFmt->nPortIndex); 2755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadPortIndex; 2756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Component should support this port definition*/ 2760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamAudioInit: 2761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PORT_PARAM_TYPE *audioPortParamType = 2763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_PORT_PARAM_TYPE *) paramData; 2764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n"); 2765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 2766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly audioPortParamType->nSize = sizeof(audioPortParamType); 2767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly audioPortParamType->nPorts = 0; 2768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly audioPortParamType->nStartPortNumber = 0; 2769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Component should support this port definition*/ 2772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamImageInit: 2773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PORT_PARAM_TYPE *imagePortParamType = 2775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_PORT_PARAM_TYPE *) paramData; 2776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n"); 2777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 2778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly imagePortParamType->nSize = sizeof(imagePortParamType); 2779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly imagePortParamType->nPorts = 0; 2780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly imagePortParamType->nStartPortNumber = 0; 2781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Component should support this port definition*/ 2785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamOtherInit: 2786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n", 2788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly paramIndex); 2789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet =OMX_ErrorUnsupportedIndex; 2790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamStandardComponentRole: 2793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PARAM_COMPONENTROLETYPE *comp_role; 2795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 2796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 2797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly comp_role->nSize = sizeof(*comp_role); 2798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n", 2800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly paramIndex); 2801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 2802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_MAX_STRINGNAME_SIZE); 2803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Added for parameter test */ 2806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamPriorityMgmt: 2807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PRIORITYMGMTTYPE *priorityMgmType = 2810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_PRIORITYMGMTTYPE *) paramData; 2811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n"); 2812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 2813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly priorityMgmType->nSize = sizeof(priorityMgmType); 2814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Added for parameter test */ 2818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamCompBufferSupplier: 2819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 2821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 2822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n"); 2823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufferSupplierType->nSize = sizeof(bufferSupplierType); 2825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 2826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(0 == bufferSupplierType->nPortIndex) 2827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 2828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (1 == bufferSupplierType->nPortIndex) 2829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 2830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 2831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadPortIndex; 2832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamVideoAvc: 2837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n", 2839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly paramIndex); 2840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamVideoH263: 2843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n", 2845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly paramIndex); 2846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamVideoMpeg4: 2849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n", 2851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly paramIndex); 2852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 2853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoMpeg2: 2855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n", 2857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 2858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoProfileLevelQuerySupported: 2861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex); 2863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType = 2864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData; 2865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P 2866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = get_supported_profile_level_for_720p(profileLevelType); 2867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 2869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = get_supported_profile_level_for_1080p(profileLevelType); 2870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 2874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: 2875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n"); 2877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 2878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 2879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 2880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(secure_mode) { 2881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED | 2882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev GRALLOC_USAGE_PRIVATE_CP_BUFFER | GRALLOC_USAGE_PRIVATE_UNCACHED); 2883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 2884a370c157f9ab6a5d4576820acd09dd4239879ffaHaynes Mathew George nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP); 2885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 2887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (MAX_RES_720P) || defined (MAX_RES_1080P_EBI) 2888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 2889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P 2890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_SMI_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 2891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 2894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n"); 2895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 2902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex); 2904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet =OMX_ErrorUnsupportedIndex; 2905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n", 2910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width, 2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_height, 2912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.stride, 2913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.scan_lines); 2914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 2919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 2920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 2924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((params == NULL) || 2926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (params->nativeBuffer == NULL) || 2927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (params->nativeBuffer->handle == NULL) || 2928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !m_enable_android_native_buffers) 2929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_android_native_buffers = OMX_TRUE; 2931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sp<android_native_buffer_t> nBuf = params->nativeBuffer; 2932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private_handle_t *handle = (private_handle_t *)nBuf->handle; 29333d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George 29343d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 29353d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 29363d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George " expected %u, got %lu", 29373d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size); 29383d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George return OMX_ErrorBadParameter; 29393d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George } 29403d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George 2941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 2942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buffer = NULL; 2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) { 2944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = (OMX_U8*)mmap(0, handle->size, 2945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 2946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(buffer == MAP_FAILED) { 2947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 2948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 2949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 2952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 2953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 2959e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 2960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::Setparameter 2961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2962e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 2963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Set Parameter method implementation. 2964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2965e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 2966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 2967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2968e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 2969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if successful. 2970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 2972e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 2973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_INDEXTYPE paramIndex, 2974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR paramData) 2975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 2976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 2977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 2978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 2979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateInvalid) 2980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Set Param in Invalid State\n"); 2982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInvalidState; 2983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(paramData == NULL) 2985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 2986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n"); 2987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 2988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 2989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((m_state != OMX_StateLoaded) && 2990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 2991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (m_out_bEnabled == OMX_TRUE) && 2992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 2993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (m_inp_bEnabled == OMX_TRUE)) { 2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Set Param in Invalid State \n"); 2995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly switch(paramIndex) 2999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3000e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamPortDefinition: 3001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 3003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 3004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has 3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //been called. 3006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n", 3007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (int)portDefn->format.video.nFrameHeight, 3008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (int)portDefn->format.video.nFrameWidth); 3009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(OMX_DirOutput == portDefn->eDir) 3010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 301157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George eRet = update_color_format(portDefn->format.video.eColorFormat); 301257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George if (eRet != OMX_ErrorNone) { 301357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George DEBUG_PRINT_ERROR("\n Setparam: color format failed for %u", 301457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George portDefn->format.video.eColorFormat); 301557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George break; 301657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George } 301757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port"); 3018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_display_id = portDefn->format.video.pNativeWindow; 301940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George unsigned int buffer_size; 302040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!client_buffers.get_buffer_req(buffer_size)) { 302140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Error in getting buffer requirements"); 302240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George eRet = OMX_ErrorBadParameter; 302340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } else { 302440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount && 302540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George portDefn->nBufferSize >= buffer_size) 302640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George { 302740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual; 302840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George drv_ctx.op_buf.buffer_size = portDefn->nBufferSize; 302940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George eRet = set_buffer_req(&drv_ctx.op_buf); 303040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (eRet == OMX_ErrorNone) 303140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_port_def = *portDefn; 303240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 303340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George else 3034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 303540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_HIGH("ERROR: OP Requirements(#%d: %u) Requested(#%d: %u)\n", 303640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size, 303740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George portDefn->nBufferCountActual, portDefn->nBufferSize); 303840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George eRet = OMX_ErrorBadParameter; 303940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 3040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(OMX_DirInput == portDefn->eDir) 3043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((portDefn->format.video.xFramerate >> 16) > 0 && 3045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) 3046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Frame rate only should be set if this is a "known value" or to 3048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // activate ts prediction logic (arbitrary mode only) sending input 3049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // timestamps with max value (LLONG_MAX). 3050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %d", 3051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.xFramerate >> 16); 3052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 3053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_denominator); 3054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!drv_ctx.frame_rate.fps_numerator) 3055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 3057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator = 30; 3058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.frame_rate.fps_denominator) 3060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator = (int) 3061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 3062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_denominator = 1; 3063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 3064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator; 3065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.frame_rate; 3066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE, 3067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < 0) 3068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setting frame rate to driver failed"); 3070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", 3072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int, drv_ctx.frame_rate.fps_numerator / 3073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (float)drv_ctx.frame_rate.fps_denominator); 3074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n"); 3076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.video_resolution.frame_height != 3077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameHeight || 3078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width != 3079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth) 3080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n", 3082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth, 3083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameHeight); 3084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (portDefn->format.video.nFrameHeight != 0x0 && 3085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth != 0x0) 3086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_height = 3088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.scan_lines = 3089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portDefn->format.video.nFrameHeight; 3090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width = 3091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.stride = 3092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portDefn->format.video.nFrameWidth; 3093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.video_resolution; 3094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 3095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES, 3096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < 0) 3097e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Set Resolution failed"); 3099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = get_buffer_req(&drv_ctx.op_buf); 3103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 3106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && portDefn->nBufferSize == drv_ctx.ip_buf.buffer_size) 3107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 3109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize; 3110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = set_buffer_req(&drv_ctx.ip_buf); 3111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\n", 3115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size, 3116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountActual, portDefn->nBufferSize); 3117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 3118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (portDefn->eDir == OMX_DirMax) 3121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 3123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (int)portDefn->nPortIndex); 3124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadPortIndex; 3125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamVideoPortFormat: 3129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 3131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 3132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n", 3133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portFmt->eColorFormat); 3134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(1 == portFmt->nPortIndex) 313657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George eRet = update_color_format(portFmt->eColorFormat); 3137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 313857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George DEBUG_PRINT_HIGH("Set_parameter: OMX_IndexParamVideoPortFormat: " 313957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George "nPortIndex (%d), nIndex (%d), eCompressionFormat (0x%x), " 314057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George "eColorFormat (0x%x), xFramerate (0x%x)", (int)portFmt->nPortIndex, 314157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George (int)portFmt->nIndex, (int)portFmt->eCompressionFormat, 314257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George (int)portFmt->eColorFormat, (int)portFmt->xFramerate); 3143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_QcomIndexPortDefn: 3147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt = 3149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData; 3150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n", 3151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portFmt->nFramePackingFormat); 3152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Input port */ 3154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (portFmt->nPortIndex == 0) 3155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) 3157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(secure_mode) { 3159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev arbitrary_bytes = false; 3160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session"); 3161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 3163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly arbitrary_bytes = true; 3164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes enabled"); 3165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (portFmt->nFramePackingFormat == 3168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_QCOM_FramePacking_OnlyOneCompleteFrame) 3169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly arbitrary_bytes = false; 3171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes disabled"); 3172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %d\n", 3176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly portFmt->nFramePackingFormat); 3177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorUnsupportedSetting; 3178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) 3181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n"); 3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid && 3184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->nMemRegion < OMX_QCOM_MemRegionMax) && 3185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) 3186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_region_smi = OMX_TRUE; 3188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) 3189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n"); 3191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_output_pmem = OMX_TRUE; 3192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamStandardComponentRole: 3199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PARAM_COMPONENTROLETYPE *comp_role; 3201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 3202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n", 3203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly comp_role->cRole); 3204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if((m_state == OMX_StateLoaded)&& 3206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 3207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("Set Parameter called in valid state"); 3209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n"); 3213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorIncorrectStateOperation; 3214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) 3217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) 3219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 3221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet =OMX_ErrorUnsupportedSetting; 3226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) 3229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) 3231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 3233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorUnsupportedSetting; 3238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) 3241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) 3243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 3245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet =OMX_ErrorUnsupportedSetting; 3250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) 3253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) 3255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 3257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 3265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 3266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) 3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 3268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 3269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) 3270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) 3273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 3275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet =OMX_ErrorUnsupportedSetting; 3280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 3283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 3284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 3285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) 3287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 3289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet =OMX_ErrorUnsupportedSetting; 3294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind); 3299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInvalidComponentName; 3300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamPriorityMgmt: 3305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state != OMX_StateLoaded) 3307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n"); 3309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorIncorrectStateOperation; 3310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 3312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n", 3313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly priorityMgmtype->nGroupID); 3314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n", 3316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly priorityMgmtype->nGroupPriority); 3317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 3319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 3320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamCompBufferSupplier: 3325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 3327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n", 3328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufferSupplierType->eBufferSupplier); 3329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 3330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 3331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadPortIndex; 3335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamVideoAvc: 3340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n", 3342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly paramIndex); 3343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamVideoH263: 3346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n", 3348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly paramIndex); 3349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_IndexParamVideoMpeg4: 3352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n", 3354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly paramIndex); 3355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoMpeg2: 3358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n", 3360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 3361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamVideoDecoderPictureOrder: 3364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder = 3366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData; 3367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY; 3368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n", 3369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pictureOrder->eOutputPictureOrder); 3370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) 3371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pic_order = VDEC_ORDER_DISPLAY; 3372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){ 3373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pic_order = VDEC_ORDER_DECODE; 3374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.set_timestamp_reorder_mode(false); 3375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 3378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P 3379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.idr_only_decoding) 3380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pictureOrder->eOutputPictureOrder != QOMX_VIDEO_DECODE_ORDER) 3382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("only decode order is supported for thumbnail mode"); 3384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 3385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order) 3389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.picture_order = pic_order; 3391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.picture_order; 3392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 3393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER, 3394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < 0) 3395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Set picture order failed"); 3397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamConcealMBMapExtraData: 3403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) 3404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, 3405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((QOMX_ENABLETYPE *)paramData)->bEnable); 3406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 3408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamFrameInfoExtraData: 3412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) 3414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, 3415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((QOMX_ENABLETYPE *)paramData)->bEnable); 3416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 3418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamInterlaceExtraData: 3423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) 3424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, 3425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((QOMX_ENABLETYPE *)paramData)->bEnable); 3426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 3428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamH264TimeInfo: 3432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) 3433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, 3434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((QOMX_ENABLETYPE *)paramData)->bEnable); 3435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 3437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamVideoDivx: 3441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P 3443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData; 3444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((divXType) && (divXType->eFormat == QOMX_VIDEO_DIVXFormat311)) { 3445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: DivX 3.11 not supported in 7x30 core."); 3446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexPlatformPvt: 3452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n"); 3454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData; 3455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) 3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type); 3458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_pvt_entry_pmem = OMX_TRUE; 3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) 3464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n"); 3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_output_pmem = OMX_TRUE; 3467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamVideoSyncFrameDecodingMode: 3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 3475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode"); 3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.idr_only_decoding = 1; 3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc = ioctl(drv_ctx.video_driver_fd, 3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_IOCTL_SET_IDR_ONLY_DECODING); 3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(rc < 0) { 3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver."); 3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P 3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) 3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set decode order for thumbnail mode"); 3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.picture_order = VDEC_ORDER_DECODE; 3488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.picture_order; 3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 3490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER, 3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < 0) 3492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Set picture order failed"); 3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamIndexExtraDataType: 3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) { 3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData; 3505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) && 3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (extradataIndexType->bEnabled == OMX_TRUE) && 3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (extradataIndexType->nPortIndex == 1)) 3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n"); 3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled); 3511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Set smooth streaming parameter 3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc = ioctl(drv_ctx.video_driver_fd, 3513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_IOCTL_SET_CONT_ON_RECONFIG); 3514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(rc < 0) { 3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver."); 3516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Need to allow following two set_parameters even in Idle 3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * state. This is ANDROID architecture which is not in sync 3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * with openmax standard. */ 3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: 3528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(enableNativeBuffers) { 3531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_enable_android_native_buffers = enableNativeBuffers->enable; 3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: 3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = use_android_native_buffer(hComp, paramData); 3538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamEnableTimeStampReorder: 3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData; 3544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.picture_order == QOMX_VIDEO_DISPLAY_ORDER) { 3545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (reorder->bEnable == OMX_TRUE) { 3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int =0; 3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.set_timestamp_reorder_mode(true); 3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.set_timestamp_reorder_mode(false); 3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 3552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.set_timestamp_reorder_mode(false); 3553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (reorder->bEnable == OMX_TRUE) 3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly default: 3561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex); 3563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorUnsupportedIndex; 3564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 3567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 3568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 3570e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 3571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::GetConfig 3572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3573e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 3574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Get Config Method implementation. 3575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3576e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 3577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 3578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3579e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 3580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if successful. 3581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 3583e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp, 3584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_INDEXTYPE configIndex, 3585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_INOUT OMX_PTR configData) 3586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 3587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 3588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_state == OMX_StateInvalid) 3590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Get Config in Invalid State\n"); 3592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInvalidState; 3593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly switch (configIndex) 3596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_QcomIndexConfigInterlaced: 3598e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_QCOM_CONFIG_INTERLACETYPE *configFmt = 3600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_QCOM_CONFIG_INTERLACETYPE *) configData; 3601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (configFmt->nPortIndex == 1) 3602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (configFmt->nIndex == 0) 3604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive; 3606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (configFmt->nIndex == 1) 3608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly configFmt->eInterlaceType = 3610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 3611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (configFmt->nIndex == 2) 3613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly configFmt->eInterlaceType = 3615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 3616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:" 3620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly " NoMore Interlaced formats\n"); 3621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorNoMore; 3622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n", 3628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (int)configFmt->nPortIndex); 3629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadPortIndex; 3630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case OMX_QcomIndexQueryNumberOfVideoDecInstance: 3634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 3636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances = 3637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData; 3638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances; 3639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void)(ioctl(drv_ctx.video_driver_fd, 3640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg)); 3641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 3642e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexConfigVideoFramePackingArrangement: 3644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 3646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt = 3648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData; 3649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->get_frame_pack_data(configFmt); 3650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs"); 3654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamFrameInfoExtraData: 3658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_EXTRADATA_FRAMEINFO *extradata = 3660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_QCOM_EXTRADATA_FRAMEINFO *) configData; 3661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_extradata == NULL){ 3663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_config: m_extradata not set. " 3664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "Aspect Ratio information missing!!"); 3665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extradata->aspectRatio.aspectRatioX = 3668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_extradata->aspectRatio.aspectRatioX; 3669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extradata->aspectRatio.aspectRatioY = 3670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_extradata->aspectRatio.aspectRatioY; 3671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly default: 3676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex); 3678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadParameter; 3679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 3684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 3685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 3687e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 3688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::SetConfig 3689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3690e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 3691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Set Config method implementation 3692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3693e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 3694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 3695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3696e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 3697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if successful. 3698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 3699e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp, 3700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_INDEXTYPE configIndex, 3701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR configData) 3702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 3703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateInvalid) 3704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Get Config in Invalid State\n"); 3706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInvalidState; 3707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE ret = OMX_ErrorNone; 3710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_VIDEO_CONFIG_NALSIZE *pNal; 3711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Set Config Called"); 3713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_state == OMX_StateExecuting) 3715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n"); 3717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return ret; 3718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (configIndex == OMX_IndexVendorVideoExtraData) 3721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData; 3723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called"); 3724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) 3725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC"); 3727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U32 extra_size; 3728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Parsing done here for the AVC atom is definitely not generic 3729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Currently this piece of code is working, but certainly 3730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // not tested with all .mp4 files. 3731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Incase of failure, we might need to revisit this 3732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // for a generic piece of code. 3733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Retrieve size of NAL length field 3735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // byte #4 contains the size of NAL lenght field 3736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly nal_length = (config->pData[4] & 0x03) + 1; 3737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly extra_size = 0; 3739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (nal_length > 2) 3740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Presently we assume that only one SPS and one PPS in AvC1 Atom */ 3742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly extra_size = (nal_length - 2) * 2; 3743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // SPS starts from byte #6 3746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]); 3747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U8 *pDestBuf; 3748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nPortIndex = config->nPortIndex; 3749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // minus 6 --> SPS starts from byte #6 3751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // minus 1 --> picture param set byte to be ignored from avcatom 3752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size; 3753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize); 3754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U32 len; 3755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U8 index = 0; 3756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // case where SPS+PPS is sent as part of set_config 3757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pDestBuf = m_vendor_config.pData; 3758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n", 3760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nPortIndex, 3761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nDataSize, 3762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.pData); 3763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly while (index < 2) 3764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly uint8 *psize; 3766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly len = *pSrcBuf; 3767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly len = len << 8; 3768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly len |= *(pSrcBuf + 1); 3769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psize = (uint8 *) & len; 3770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memcpy(pDestBuf + nal_length, pSrcBuf + 2,len); 3771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly for (int i = 0; i < nal_length; i++) 3772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pDestBuf[i] = psize[nal_length - 1 - i]; 3774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly //memcpy(pDestBuf,pSrcBuf,(len+2)); 3776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pDestBuf += len + nal_length; 3777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pSrcBuf += len + 2; 3778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly index++; 3779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pSrcBuf++; // skip picture param set 3780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly len = 0; 3781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") || 3784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) 3785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nPortIndex = config->nPortIndex; 3787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nDataSize = config->nDataSize; 3788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize)); 3789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memcpy(m_vendor_config.pData, config->pData,config->nDataSize); 3790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) 3792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_vendor_config.pData) 3794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly free(m_vendor_config.pData); 3796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.pData = NULL; 3797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nDataSize = 0; 3798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (((*((OMX_U32 *) config->pData)) & 3801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly VC1_SP_MP_START_CODE_MASK) == 3802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly VC1_SP_MP_START_CODE) 3803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n"); 3805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nPortIndex = config->nPortIndex; 3806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nDataSize = config->nDataSize; 3807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.pData = 3808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_U8 *) malloc(config->nDataSize); 3809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memcpy(m_vendor_config.pData, config->pData, 3810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly config->nDataSize); 3811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vc1_profile = VC1_SP_MP_RCV; 3812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) 3814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n"); 3816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nPortIndex = config->nPortIndex; 3817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nDataSize = config->nDataSize; 3818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.pData = 3819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (OMX_U8 *) malloc((config->nDataSize)); 3820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memcpy(m_vendor_config.pData, config->pData, 3821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly config->nDataSize); 3822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vc1_profile = VC1_AP; 3823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if ((config->nDataSize == VC1_STRUCT_C_LEN)) 3825e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n"); 3827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nPortIndex = config->nPortIndex; 3828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.nDataSize = config->nDataSize; 3829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize); 3830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memcpy(m_vendor_config.pData,config->pData,config->nDataSize); 3831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vc1_profile = VC1_SP_MP_RCV; 3832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 3834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n"); 3836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return ret; 3839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (configIndex == OMX_IndexConfigVideoNalSize) 3841e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData); 3844e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly nal_length = pNal->nNaluBytes; 3845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_frame_parser.init_nal_length(nal_length); 3846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length); 3847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return ret; 3848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNotImplemented; 3851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 3852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 3854e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 3855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::GetExtensionIndex 3856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3857e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 3858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX GetExtensionIndex method implementaion. <TBD> 3859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3860e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 3861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 3862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3863e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 3864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if everything successful. 3865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 3867e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 3868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_STRING paramName, 3869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT OMX_INDEXTYPE* indexType) 3870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 3871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateInvalid) 3872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n"); 3874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInvalidState; 3875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) { 3877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode; 3878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 3880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) 3881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType; 3883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 3886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) { 3887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 3888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) { 3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 3891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) { 3893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName); 3894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 3895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) { 3897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 3898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName); 3902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNotImplemented; 3903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 3905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 3906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 3908e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 3909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::GetState 3910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3911e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 3912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Returns the state information back to the caller.<TBD> 3913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3914e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 3915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 3916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3917e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 3918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Error None if everything is successful. 3919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 3920e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp, 3921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT OMX_STATETYPE* state) 3922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 3923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly *state = m_state; 3924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state); 3925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 3926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 3927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 3929e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 3930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::ComponentTunnelRequest 3931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3932e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 3933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Component Tunnel Request method implementation. <TBD> 3934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3935e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 3936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 3937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3938e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 3939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if everything successful. 3940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 3942e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 3943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 port, 3944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_HANDLETYPE peerComponent, 3945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 peerPort, 3946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 3947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 3948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n"); 3949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNotImplemented; 3950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 3951e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 3953e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 3954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::UseOutputBuffer 3955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3956e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 3957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Helper function for Use buffer in the input pin 3958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3959e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 3960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 3961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3962e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 3963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 3964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 3966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_output_buffer( 3967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_HANDLETYPE hComp, 3968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 3969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 port, 3970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR appData, 3971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 bytes, 3972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U8* buffer) 3973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 3974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 3975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 3976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i= 0; // Temporary counter 3977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 3978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_setbuffer_cmd setbuffers; 3979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PTR privateAppData = NULL; 3980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 3981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private_handle_t *handle = NULL; 3982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buff = buffer; 3984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 3985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_out_mem_ptr) { 3986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers"); 3987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = allocate_output_headers(); 3988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 3989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 3990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 3991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //allocate H264_mv_buffer 3992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = vdec_alloc_h264_mv(); 3993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet) { 3994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n"); 3995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 3996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 3998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) { 4003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i< drv_ctx.op_buf.actualcount; i++) { 4004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_ABSENT(&m_out_bm_count,i)) 4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 4007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(i >= drv_ctx.op_buf.actualcount) { 4012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 4013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) { 4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_enable_android_native_buffers) { 40183d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George if (m_use_android_native_buffers) { 40193d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 40203d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George sp<android_native_buffer_t> nBuf = params->nativeBuffer; 40213d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George handle = (private_handle_t *)nBuf->handle; 40223d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George privateAppData = params->pAppPrivate; 40233d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George } else { 40243d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George handle = (private_handle_t *)buff; 40253d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George privateAppData = appData; 4026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 40273d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George 40283d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 40293d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 40303d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George " expected %u, got %lu", 40313d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size); 40323d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George return OMX_ErrorBadParameter; 4033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 40343d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George 40353d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George if (!m_use_android_native_buffers) { 40363d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George if (!secure_mode) { 40373d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George buff = (OMX_U8*)mmap(0, handle->size, 40383d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 40393d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George if (buff == MAP_FAILED) { 40403d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 40413d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George return OMX_ErrorInsufficientResources; 40423d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George } 40433d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George } 40443d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George } 40453d672d398c2d0e87cc3016ba0236c08f580f7d3aHaynes Mathew George 4046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_ICS_) 4047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev native_buffer[i].nativehandle = handle; 4048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!handle) { 4050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 4054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].offset = 0; 4055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].mmaped_size = 4057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 4058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else 4059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!ouput_egl_buffers && !m_use_output_pmem) { 4062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 4064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 4065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 4066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.op_buf_ion_info[i].fd_ion_data,CACHED); 4067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 4068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 4071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 4072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 4073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 4074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev open (MEM_DEVICE,O_RDWR); 4075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 4077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) 4081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 4083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev open (MEM_DEVICE,O_RDWR); 4084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 4085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 4090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size, 4091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.alignment)) 4092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed"); 4094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) { 4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr = 4100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, 4102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 4103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 4104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 4105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 4107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].offset = 0; 4112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev privateAppData = appData; 4113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 4115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem); 4117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!appData || !bytes ) 4119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Invalid appData or bytes"); 4121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode && !buffer) 4125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case"); 4127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 4132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 4133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 4134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!pmem_list->entryList || !pmem_list->entryList->entry || 4135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !pmem_list->nEntries || 4136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 4137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer"); 4138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 4141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_list->entryList->entry; 4142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x", 4143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_info->pmem_fd); 4144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 4145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 4146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 4147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].mmaped_size = 4148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 4149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev privateAppData = appData; 4150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 4152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd; 4153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *bufferHdr = (m_out_mem_ptr + i ); 4155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(secure_mode) 4156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 4157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 4158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 4159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof (vdec_bufferpayload)); 4160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &setbuffers; 4162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 4163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i, 4165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd ); 4166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER, 4167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &ioctl_msg) < 0) 4168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Set output buffer failed"); 4170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // found an empty buffer at i 4173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 4174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_enable_android_native_buffers) { 4175edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle); 4176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->pBuffer = (OMX_U8 *)handle; 4177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 4178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->pBuffer = buff; 4179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->pAppPrivate = privateAppData; 4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_out_bm_count,i); 4182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 4184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 4185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 4187e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 4188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::use_input_heap_buffers 4189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4190e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 4191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Use Buffer Heap allocation method implementation. 4192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4193e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 4194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 4195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4196e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 4197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None , if everything successful. 4198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 4200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_input_heap_buffers( 4201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_HANDLETYPE hComp, 4202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 port, 4204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR appData, 4205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 bytes, 4206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U8* buffer) 4207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 4208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer); 4209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 4210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_inp_heap_ptr) 4211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 4212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 4213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount); 4214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_phdr_pmem_ptr) 4215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 4216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 4217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount); 4218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_inp_heap_ptr || !m_phdr_pmem_ptr) 4219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Insufficent memory"); 4221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 4222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) 4224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_use_buffer = true; 4226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 4227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 4228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 4229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 4231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 4234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], NULL, NULL)) 4236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Free_q is full"); 4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_in_alloc_cnt++; 4241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("All i/p buffers have been set!"); 4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 4246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 4248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 4249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 4251e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 4252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::UseBuffer 4253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4254e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 4255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Use Buffer method implementation. 4256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4257e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 4258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 4259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4260e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 4261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None , if everything successful. 4262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 4264e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::use_buffer( 4265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_HANDLETYPE hComp, 4266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 port, 4268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR appData, 4269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 bytes, 4270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U8* buffer) 4271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 4272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE error = OMX_ErrorNone; 4273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_setbuffer_cmd setbuffers; 4274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 4275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (bufferHdr == NULL || bytes == 0) 4277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("bad param 0x%p %ld",bufferHdr, bytes); 4279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode && buffer == NULL) { 4283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("bad param 0x%p",buffer); 4284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 4288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n"); 4290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 4291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(port == OMX_CORE_INPUT_PORT_INDEX) 4293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 4294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 4295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested 4296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port); 4299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev error = OMX_ErrorBadPortIndex; 4300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error); 4302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(error == OMX_ErrorNone) 4303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 4305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 4308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet,OMX_StateIdle, 4309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 4312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) 4313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 4315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 4316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX, 4317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 4320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) 4321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 4323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 4324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_OUTPUT_PORT_INDEX, 4325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return error; 4329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex, 4332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *pmem_bufferHdr) 4333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) 4335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_inp_heap_ptr[bufferindex].pBuffer) 4337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_inp_heap_ptr[bufferindex].pBuffer); 4338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[bufferindex].pBuffer = NULL; 4339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_bufferHdr) 4341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer(pmem_bufferHdr); 4342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 4343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 4344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4345e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 4347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned int index = 0; 4348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (bufferHdr == NULL || m_inp_mem_ptr == NULL) 4349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 4351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly index = bufferHdr - m_inp_mem_ptr; 4354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index); 4355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) 4357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index); 4359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) 4360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 4362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_setbuffer_cmd setbuffers; 4363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT; 4364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 4365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sizeof (vdec_bufferpayload)); 4366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &setbuffers; 4367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 4368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ioctl_r = ioctl (drv_ctx.video_driver_fd, 4369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly VDEC_IOCTL_FREE_BUFFER, &ioctl_msg); 4370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (ioctl_r < 0) 4371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r); 4373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!secure_mode) { 4375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d", 4376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].pmem_fd); 4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n unmap the input buffer size=%d address = %d", 4378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].mmaped_size, 4379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].bufferaddr); 4380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 4381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].mmaped_size); 4382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close (drv_ctx.ptr_inputbuffer[index].pmem_fd); 4384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 4385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) 4386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_desc_buffer_ptr[index].buf_addr); 4388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_desc_buffer_ptr[index].buf_addr = NULL; 4389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_desc_buffer_ptr[index].desc_data_size = 0; 4390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 4393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 4398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 4399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4400e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 4402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned int index = 0; 4403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (bufferHdr == NULL || m_out_mem_ptr == NULL) 4405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nfree_output_buffer ERROR"); 4407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 4408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly index = bufferHdr - m_out_mem_ptr; 4411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index); 4412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (index < drv_ctx.op_buf.actualcount 4414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && drv_ctx.ptr_outputbuffer) 4415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index, 4417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].bufferaddr); 4418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 4420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_setbuffer_cmd setbuffers; 4421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 4422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 4423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sizeof (vdec_bufferpayload)); 4424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &setbuffers; 4425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 4426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nRelease the Output Buffer"); 4427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER, 4428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &ioctl_msg) < 0) 4429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nRelease output buffer failed in VCD"); 4430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 4432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_enable_android_native_buffers) { 4433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 4434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) { 4435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 4436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].mmaped_size); 4437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 4440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 4441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) 4443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) { 4445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d", 4446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].pmem_fd); 4447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d address = %d", 4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].mmaped_size, 4449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].bufferaddr); 4450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev munmap (drv_ctx.ptr_outputbuffer[index].bufferaddr, 4451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].mmaped_size); 4452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.op_buf_ion_info[index]); 4455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close (drv_ctx.ptr_outputbuffer[index].pmem_fd); 4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 4458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 4459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_ptr[index].video_heap_ptr = NULL; 4460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_count = m_heap_count - 1; 4461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_heap_count == 0) 4462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_heap_ptr); 4464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_ptr = NULL; 4465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_ 4467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 4469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 4473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 4474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_dealloc_h264_mv(); 4476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 4480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 4482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4483e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 4484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_BUFFERHEADERTYPE **bufferHdr, 4485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U32 port, 4486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_PTR appData, 4487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U32 bytes) 4488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 4489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_BUFFERHEADERTYPE *input = NULL; 4490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned char *buf_addr = NULL; 4491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 4492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned i = 0; 4493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /* Sanity Check*/ 4495e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (bufferHdr == NULL) 4496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 4498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_inp_heap_ptr == NULL) 4501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 4503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 4504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount); 4505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 4506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 4507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount); 4508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_inp_heap_ptr == NULL) 4510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed "); 4512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInsufficientResources; 4513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Find a Free index*/ 4517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i< drv_ctx.ip_buf.actualcount; i++) 4518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_ABSENT(&m_heap_inp_bm_count,i)) 4520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i); 4522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 4523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (i < drv_ctx.ip_buf.actualcount) 4527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 4529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (buf_addr == NULL) 4531e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInsufficientResources; 4533e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly *bufferHdr = (m_inp_heap_ptr + i); 4536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input = *bufferHdr; 4537e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_heap_inp_bm_count,i); 4538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input->pBuffer = (OMX_U8 *)buf_addr; 4540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 4541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input->nVersion.nVersion = OMX_SPEC_VERSION; 4542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->nAllocLen = drv_ctx.ip_buf.buffer_size; 4543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input->pAppPrivate = appData; 4544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 4545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr ); 4546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 4547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr [i] ); 4548e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Add the Buffers to freeq*/ 4549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr [i],NULL,NULL)) 4550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR:Free_q is full"); 4552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInsufficientResources; 4553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 4556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 4558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 4561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 4563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 4566e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 4567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::AllocateInputBuffer 4568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4569e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 4570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Helper function for allocate buffer in the input pin 4571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4572e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 4573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 4574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4575e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 4576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 4577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 4579e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::allocate_input_buffer( 4580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_HANDLETYPE hComp, 4581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 port, 4583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR appData, 4584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 bytes) 4585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 4586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 4588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_setbuffer_cmd setbuffers; 4589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_BUFFERHEADERTYPE *input = NULL; 4590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 4591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned i = 0; 4592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned char *buf_addr = NULL; 4593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly int pmem_fd = -1; 4594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(bytes != drv_ctx.ip_buf.buffer_size) 4596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d", 4598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bytes, drv_ctx.ip_buf.buffer_size); 4599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly //return OMX_ErrorBadParameter; 4600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!m_inp_mem_ptr) 4603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)", 4605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount, 4606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.buffer_size); 4607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 4609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 4610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_inp_mem_ptr == NULL) 4612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInsufficientResources; 4614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \ 4617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount); 4618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_inputbuffer == NULL) 4620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \ 4625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount); 4626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ip_buf_ion_info == NULL) 4628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInsufficientResources; 4630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (i=0; i < drv_ctx.ip_buf.actualcount; i++) 4634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 4636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 4638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i< drv_ctx.ip_buf.actualcount; i++) 4643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4644e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_ABSENT(&m_inp_bm_count,i)) 4645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i); 4647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 4648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(i < drv_ctx.ip_buf.actualcount) 4652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Allocate input Buffer"); 4654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 4657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 4658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 4659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.ip_buf_ion_info[i].fd_ion_data,CACHED); 4660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 4661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 4664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 4665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = open (MEM_DEVICE,O_RDWR); 4666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pmem_fd < 0) 4668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer"); 4670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInsufficientResources; 4671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pmem_fd == 0) 4674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = open (MEM_DEVICE,O_RDWR); 4676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pmem_fd < 0) 4678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer"); 4680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInsufficientResources; 4681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size, 4685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.alignment)) 4686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed"); 4688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly close(pmem_fd); 4689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInsufficientResources; 4690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!secure_mode) { 4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_addr = (unsigned char *)mmap(NULL, 4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.buffer_size, 4695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 4696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buf_addr == MAP_FAILED) 4698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(pmem_fd); 4700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 4702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer"); 4704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *bufferHdr = (m_inp_mem_ptr + i); 4708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (secure_mode) 4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr; 4710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 4712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 4713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].offset = 0; 4716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT; 4718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer [i], 4719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sizeof (vdec_bufferpayload)); 4720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &setbuffers; 4721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 4722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER, 4724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly &ioctl_msg) < 0) 4725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Set Buffers Failed"); 4727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInsufficientResources; 4728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input = *bufferHdr; 4731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_SET(&m_inp_bm_count,i); 4732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr); 4733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (secure_mode) 4734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd; 4735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->pBuffer = (OMX_U8 *)buf_addr; 4737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 4738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input->nVersion.nVersion = OMX_SPEC_VERSION; 4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->nAllocLen = drv_ctx.ip_buf.buffer_size; 4740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input->pAppPrivate = appData; 4741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 4742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; 4743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.disable_dmx) 4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = allocate_desc_buffer(i); 4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 4750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found"); 4752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInsufficientResources; 4753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 4755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 4756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 4759e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 4760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::AllocateOutputBuffer 4761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4762e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 4763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Helper fn for AllocateBuffer in the output pin 4764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4765e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 4766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 4767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4768e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 4769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if everything went well. 4770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 4772e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::allocate_output_buffer( 4773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_HANDLETYPE hComp, 4774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 port, 4776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR appData, 4777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 bytes) 4778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 4779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 4780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 4781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned i= 0; // Temporary counter 4782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 4783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_setbuffer_cmd setbuffers; 4784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ion_device_fd =-1; 4786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct ion_allocation_data ion_alloc_data; 4787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct ion_fd_data fd_ion_data; 4788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nBufHdrSize = 0; 4791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPlatformEntrySize = 0; 4792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPlatformListSize = 0; 4793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPMEMInfoSize = 0; 4794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int pmem_fd = -1; 4795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned char *pmem_baseaddress = NULL; 4796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 4798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 4799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 4800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_out_mem_ptr) 4802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)", 4804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount, 4805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size); 4806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n", 4808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nBufHdrSize = drv_ctx.op_buf.actualcount * 4811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_BUFFERHEADERTYPE); 4812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPMEMInfoSize = drv_ctx.op_buf.actualcount * 4814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 4815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformListSize = drv_ctx.op_buf.actualcount * 4816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 4817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformEntrySize = drv_ctx.op_buf.actualcount * 4818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 4819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize, 4821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sizeof(OMX_BUFFERHEADERTYPE), 4822e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly nPMEMInfoSize, 4823e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly nPlatformListSize); 4824e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize, 4825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4826e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4827e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 4828e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Alloc mem for platform specific info 4829e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly char *pPtr=NULL; 4830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 4831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly nPMEMInfoSize,1); 4832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\ 4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof(struct vdec_bufferpayload), 4834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 4836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof (struct vdec_output_frameinfo), 4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = (struct vdec_ion *)\ 4840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof(struct vdec_ion), 4841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_ptr = (struct vidc_heap *)\ 4845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof(struct vidc_heap), 4846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 4850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && drv_ctx.ptr_respbuffer 4851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && m_heap_ptr 4853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 4855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[0].mmaped_size = 4857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (drv_ctx.op_buf.buffer_size * 4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufHdr = m_out_mem_ptr; 4860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 4861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 4862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (((char *) m_platform_list) + nPlatformListSize); 4863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 4864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (((char *) m_platform_entry) + nPlatformEntrySize); 4865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPlatformList = m_platform_list; 4866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPlatformEntry = m_platform_entry; 4867e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPMEMInfo = m_pmem_info; 4868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr); 4870e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Settting the entire storage nicely 4872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry); 4873e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo); 4874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i < drv_ctx.op_buf.actualcount ; i++) 4875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 4877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 4878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Set the values when we determine the right HxW param 4879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nAllocLen = 0; 4880e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufHdr->nFilledLen = 0; 4881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pAppPrivate = NULL; 4882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 4883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Platform specific PMEM Information 4884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Initialize the Platform Entry 4885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i); 4886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 4887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPlatformEntry->entry = pPMEMInfo; 4888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Initialize the Platform List 4889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPlatformList->nEntries = 1; 4890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPlatformList->entryList = pPlatformEntry; 4891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Keep pBuffer NULL till vdec is opened 4892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufHdr->pBuffer = NULL; 4893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo->offset = 0; 4895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPMEMInfo->pmem_fd = 0; 4896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufHdr->pPlatformPrivate = pPlatformList; 4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 4898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 4900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4901e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Create a mapping between buffers*/ 4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 4904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.ptr_outputbuffer[i]; 4905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 4906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_ptr[i].video_heap_ptr = NULL; 4907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Move the buffer and buffer header pointers 4909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufHdr++; 4910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPMEMInfo++; 4911e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPlatformEntry++; 4912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPlatformList++; 4913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 4915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eRet == OMX_ErrorNone && drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //Allocate the h264_mv_buffer 4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = vdec_alloc_h264_mv(); 4919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eRet) { 4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n"); 4921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 4927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\ 4929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_mem_ptr, pPtr); 4930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_out_mem_ptr) 4931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly free(m_out_mem_ptr); 4933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_mem_ptr = NULL; 4934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(pPtr) 4936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly free(pPtr); 4938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pPtr = NULL; 4939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_outputbuffer) 4941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.ptr_outputbuffer); 4943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer = NULL; 4944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_respbuffer) 4946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.ptr_respbuffer); 4948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer = NULL; 4949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 4952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free o/p ion context"); 4953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.op_buf_ion_info); 4954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 4955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInsufficientResources; 4958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (i=0; i< drv_ctx.op_buf.actualcount; i++) 4962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_ABSENT(&m_out_bm_count,i)) 4964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Found a Free Output Buffer Index %d",i); 4966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 4967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (i < drv_ctx.op_buf.actualcount) 4971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 4972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Allocate Output Buffer"); 4973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 4976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 4977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 4978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.op_buf_ion_info[i].fd_ion_data, CACHED); 4979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 4980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 4982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 4983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 4984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = open (MEM_DEVICE,O_RDWR); 4985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_fd < 0) 4987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d", 4989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size); 4990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4992e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 4993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_fd == 0) 4994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = open (MEM_DEVICE,O_RDWR); 4996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_fd < 0) 4998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d", 5000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size); 5001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 5002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size, 5006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.alignment)) 5007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed"); 5009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(pmem_fd); 5010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 5011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!secure_mode) { 5014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_baseaddress = (unsigned char *)mmap(NULL, 5015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size, 5016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 5017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_baseaddress == MAP_FAILED) 5019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n MMAP failed for Size %d", 5021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size); 5022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(pmem_fd); 5023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 5024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 5025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 5027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *bufferHdr = (m_out_mem_ptr + i); 5031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (secure_mode) 5032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer [i].bufferaddr = *bufferHdr; 5033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer [i].bufferaddr = pmem_baseaddress; 5035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer [i].pmem_fd = pmem_fd; 5037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer [i].buffer_len = drv_ctx.op_buf.buffer_size; 5038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer [i].mmaped_size = drv_ctx.op_buf.buffer_size; 5039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer [i].offset = 0; 5040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 5042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev #ifdef USE_ION 5043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_ptr[i].video_heap_ptr = new VideoHeap (drv_ctx.op_buf_ion_info[i].ion_device_fd, 5044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size, 5045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_baseaddress, 5046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_alloc_data.handle, 5047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd); 5048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_count = m_heap_count + 1; 504940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George#else 5050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_ptr[i].video_heap_ptr = new VideoHeap (pmem_fd, 5051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size, 5052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_baseaddress); 5053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 5057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 5058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info[i].pmem_fd = (OMX_U32) m_heap_ptr[i].video_heap_ptr.get (); 5059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 5060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd ; 5061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 5063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer [i], 5064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof (vdec_bufferpayload)); 5065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &setbuffers; 5066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 5067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]); 5069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER, 5070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &ioctl_msg) < 0) 5071e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Set output buffer failed"); 5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 5074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5075e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // found an empty buffer at i 5077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 5078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 5079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->pAppPrivate = appData; 5080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_out_bm_count,i); 5081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Output Buffer Index not found"); 5086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 5087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 5089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 5090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5091e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// AllocateBuffer -- API Call 5093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 5094e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 5095e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::AllocateBuffer 5096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5097e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 5098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Returns zero if all the buffers released.. 5099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5100e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 5101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 5102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5103e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 5104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 5105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 5107e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 5108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 5109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 port, 5110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR appData, 5111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 bytes) 5112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 5113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned i = 0; 5114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 5115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port); 5117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateInvalid) 5118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n"); 5120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInvalidState; 5121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(port == OMX_CORE_INPUT_PORT_INDEX) 5124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (arbitrary_bytes) 5126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes); 5128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); 5132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 5135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 513640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port, 513740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George appData,bytes); 5138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port); 5142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadPortIndex; 5143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 5145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(eRet == OMX_ErrorNone) 5146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(allocate_done()){ 5148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 5149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Send the callback now 5151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 5152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_CommandStateSet,OMX_StateIdle, 5153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 5154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) 5157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) 5159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 5161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_CommandPortEnable, 5162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_CORE_INPUT_PORT_INDEX, 5163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 5164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) 5167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) 5169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 5171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_CommandPortEnable, 5172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_CORE_OUTPUT_PORT_INDEX, 5173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 5174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet); 5178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 5179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 5180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Free Buffer - API call 5182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 5183e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 5184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::FreeBuffer 5185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5186e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 5187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5188e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 5189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 5190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5191e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 5192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 5193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 5195e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 5196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 port, 5197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 5199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 5200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned int nPortIndex; 5201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("In for decoder free_buffer \n"); 5203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateIdle && 5205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) 5206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n"); 5208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 5210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) 5211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port); 5213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause) 5215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n"); 5217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError, 5218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ErrorPortUnpopulated, 5219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 5220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 5222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if (m_state != OMX_StateInvalid) 5224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n"); 5226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_EventError, 5227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ErrorPortUnpopulated, 5228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 5229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(port == OMX_CORE_INPUT_PORT_INDEX) 5232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Check if arbitrary bytes*/ 5234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!arbitrary_bytes && !input_use_buffer) 5235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly nPortIndex = buffer - m_inp_mem_ptr; 5236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPortIndex = buffer - m_inp_heap_ptr; 5238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex); 5240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(nPortIndex < drv_ctx.ip_buf.actualcount) 5241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Clear the bit associated with it. 5243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 5244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 5245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (input_use_buffer == true) 5246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex); 5249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_phdr_pmem_ptr) 5250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 5251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 5255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_phdr_pmem_ptr) 5257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]); 5258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer(nPortIndex,NULL); 5260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer(buffer); 5263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_bPopulated = OMX_FALSE; 5265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Free the Buffer Header*/ 5266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (release_input_done()) 5267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released"); 5269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer_header(); 5270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n"); 5275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadPortIndex; 5276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 5279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly && release_input_done()) 5280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n"); 5282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 5283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_CommandPortDisable, 5284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_CORE_INPUT_PORT_INDEX, 5285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 5286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 5289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // check if the buffer is valid 529140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 5292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(nPortIndex < drv_ctx.op_buf.actualcount) 5293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex); 5295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Clear the bit associated with it. 5296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 5297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_bPopulated = OMX_FALSE; 529840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George client_buffers.free_output_buffer (buffer); 5299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (release_output_done()) 5301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer_header(); 5303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n"); 5308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadPortIndex; 5309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 5311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && release_output_done()) 5312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n"); 5314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n"); 5316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 5317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 5318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_enable_android_native_buffers) 5319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 5321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 5322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_CommandPortDisable, 5326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_CORE_OUTPUT_PORT_INDEX, 5327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 5328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorBadPortIndex; 5333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if((eRet == OMX_ErrorNone) && 5335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) 5336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(release_done()) 5338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Send the callback now 5340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 5341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event(OMX_CommandStateSet, OMX_StateLoaded, 5342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT); 5343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 5346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 5347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 5350e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 5351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::EmptyThisBuffer 5352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5353e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 5354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly This routine is used to push the encoded video frames to 5355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly the video decoder. 5356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5357e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 5358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 5359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5360e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 5361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if everything went successful. 5362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 5364e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 5365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 5367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE ret1 = OMX_ErrorNone; 5368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 5369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) 5371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_config_flag = true; 5373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__); 5374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_config_flag = false; 5378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateInvalid) 5381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n"); 5383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInvalidState; 5384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (buffer == NULL) 5387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL"); 5389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 5390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_inp_bEnabled) 5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled."); 5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 5396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) 5399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %d", buffer->nInputPortIndex); 5401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadPortIndex; 5402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 5405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(iDivXDrmDecrypt) 5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer); 5408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drmErr != OMX_ErrorNone) { 5409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // this error can be ignored 5410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr); 5411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (perf_flag) 5414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!latency) 5416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.stop(); 5418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev latency = dec_time.processing_time_us(); 5419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.start(); 5420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (arbitrary_bytes) 5425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly nBufferIndex = buffer - m_inp_heap_ptr; 5427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (input_use_buffer == true) 5431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nBufferIndex = buffer - m_inp_heap_ptr; 5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 5436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = &m_inp_mem_ptr[nBufferIndex]; 5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d", 5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen); 5439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else{ 5441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nBufferIndex = buffer - m_inp_mem_ptr; 5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (nBufferIndex > drv_ctx.ip_buf.actualcount ) 5446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid"); 5448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 5449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)", 5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen); 5453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (arbitrary_bytes) 5454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event ((unsigned)hComp,(unsigned)buffer, 5456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_ETB_ARBITRARY); 5457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!(client_extradata & OMX_TIMEINFO_EXTRADATA)) 5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev set_frame_rate(buffer->nTimeStamp); 5462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB); 5463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 5465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 5466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 5468e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 5469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::empty_this_buffer_proxy 5470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5471e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 5472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly This routine is used to push the encoded video frames to 5473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly the video decoder. 5474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5475e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 5476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 5477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5478e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 5479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if everything went successful. 5480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 5482e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 5483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 5485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly int push_cnt = 0,i=0; 5486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned nPortIndex = 0; 5487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE ret = OMX_ErrorNone; 5488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_input_frameinfo frameinfo; 5489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_bufferpayload *temp_buffer; 5490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_ioctl_msg ioctl_msg; 5491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_seqheader seq_header; 5492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool port_setting_changed = true; 5493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 5494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool not_coded_vop = false; 5495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Should we generate a Aync error event*/ 5498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (buffer == NULL || buffer->pInputPortPrivate == NULL) 5499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid"); 5501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 5502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 5505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (nPortIndex > drv_ctx.ip_buf.actualcount) 5507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 5509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly nPortIndex); 5510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 5511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pending_input_buffers++; 5514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* return zero length and not an EOS buffer */ 5516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!arbitrary_bytes && (buffer->nFilledLen == 0) && 5517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) 5518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n return zero legth buffer"); 5520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 5521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EBD); 5522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 5523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 5526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){ 5527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mp4StreamType psBits; 5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset); 5529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psBits.numBytes = buffer->nFilledLen; 5530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mp4_headerparser.parseHeader(&psBits); 5531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev not_coded_vop = mp4_headerparser.is_notcodec_vop( 5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(not_coded_vop) { 5534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Found Not coded vop len %d frame number %d", 5535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen,frame_count); 5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(buffer->nFlags & OMX_BUFFERFLAG_EOS){ 5537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero"); 5538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev not_coded_vop = false; 5539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 5540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(input_flush_progress == true 5545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 5546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev || not_coded_vop 5547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 5549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Flush in progress return buffer "); 5551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 5552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EBD); 5553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 5554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate; 5557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) 5559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 5561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 5564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*for use buffer we need to memcpy the data*/ 5565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly temp_buffer->buffer_len = buffer->nFilledLen; 5566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (input_use_buffer) 5568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (buffer->nFilledLen <= temp_buffer->buffer_len) 5570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(arbitrary_bytes) 5572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 5574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset), 5578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen); 5579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 5584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frameinfo.bufferaddr = temp_buffer->bufferaddr; 5589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frameinfo.client_data = (void *) buffer; 5590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frameinfo.datalen = temp_buffer->buffer_len; 5591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frameinfo.flags = 0; 5592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frameinfo.offset = buffer->nOffset; 5593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frameinfo.pmem_fd = temp_buffer->pmem_fd; 5594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frameinfo.pmem_offset = temp_buffer->offset; 5595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frameinfo.timestamp = buffer->nTimeStamp; 5596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) 5597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("ETB: dmx enabled"); 5599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_demux_entries == 0) 5600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extract_demux_addr_offsets(buffer); 5602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries); 5605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev handle_demux_data(buffer); 5606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr; 5607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size; 5608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.desc_addr = NULL; 5612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.desc_size = 0; 5613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!arbitrary_bytes) 5615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.flags |= buffer->nFlags; 5617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 5621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_debug_timestamp) 5622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(arbitrary_bytes) 5624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 5626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_timestamp_list.insert_ts(buffer->nTimeStamp); 5627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) 5629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 5631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_timestamp_list.insert_ts(buffer->nTimeStamp); 5632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 5637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (inputBufferFile1) 5638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fwrite((const char *)temp_buffer->bufferaddr, 5640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_buffer->buffer_len,1,inputBufferFile1); 5641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) 5645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 5647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 5648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) 5651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached"); 5653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.flags |= VDEC_BUFFERFLAG_EOS; 5654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 5655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_count = 0; 5656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev look_ahead_nal = false; 5657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_count = 0; 5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.mutils) 5659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->initialize_frame_checking_environment(); 5660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.flush(); 5661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts = LLONG_MAX; 5662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_flags = 0; 5663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 5664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries = 0; 5665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)", 5667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen); 5668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &frameinfo; 5669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 5670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl(drv_ctx.video_driver_fd,VDEC_IOCTL_DECODE_FRAME, 5671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly &ioctl_msg) < 0) 5672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Generate an async error and move to invalid state*/ 5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy VDEC_IOCTL_DECODE_FRAME failed"); 5675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!arbitrary_bytes) 5676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Return failed buffer"); 5678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 5679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EBD); 5680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else 5683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.insert_timestamp(buffer); 5684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return ret; 5686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 5687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 5689e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 5690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::FillThisBuffer 5691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5692e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 5693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly IL client uses this method to release the frame buffer 5694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly after displaying them. 5695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5696e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 5697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 5698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5699e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 5700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 5701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 5703e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 5704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 5706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_state == OMX_StateInvalid) 5708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("FTB in Invalid State\n"); 5710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorInvalidState; 5711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_out_bEnabled) 5714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled."); 5716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 5717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 571940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (buffer == NULL || 572040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount)) 5721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 5723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) 5726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %d", buffer->nOutputPortIndex); 5728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadPortIndex; 5729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 573240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George post_event((unsigned) hComp, (unsigned)buffer,m_fill_output_msg); 5733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 5734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 5735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 5736e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 5737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::fill_this_buffer_proxy 5738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5739e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 5740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly IL client uses this method to release the frame buffer 5741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly after displaying them. 5742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5743e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 5744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 5745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5746e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 5747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 5748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 5750e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( 5751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_HANDLETYPE hComp, 5752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 5753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 5754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE nRet = OMX_ErrorNone; 5755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 5756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 5757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_fillbuffer_cmd fillbuffer; 5758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_bufferpayload *ptr_outputbuffer = NULL; 5759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_output_frameinfo *ptr_respbuffer = NULL; 5760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 576240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (bufferAdd == NULL || ((buffer - client_buffers.get_il_buf_hdr()) > 5763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount) ) 5764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 5765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", 5767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bufferAdd, bufferAdd->pBuffer); 5768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Return back the output buffer to client*/ 5769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true) 5770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition"); 5772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 5773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cb.FillBufferDone (hComp,m_app_data,buffer); 5774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 5775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pending_output_buffers++; 577740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer = client_buffers.get_dr_buf_hdr(bufferAdd); 5778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate; 5779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (ptr_respbuffer) 5780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data; 5782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) 5785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 5787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 5788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.FillBufferDone (hComp,m_app_data,buffer); 5789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_output_buffers--; 5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 5791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memcpy (&fillbuffer.buffer,ptr_outputbuffer,\ 5794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly sizeof(struct vdec_bufferpayload)); 579540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George fillbuffer.client_data = buffer; 5796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 5798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_enable_android_native_buffers) 5799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Acquire a write lock on this buffer. 5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (GENLOCK_NO_ERROR != genlock_lock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle, 5802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) { 5803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to acquire genlock"); 5804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 5805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.FillBufferDone (hComp,m_app_data,buffer); 5806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_output_buffers--; 5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 5808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 5809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev native_buffer[buffer - m_out_mem_ptr].inuse = true; 5810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &fillbuffer; 5815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 5816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd, 5817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) 5818e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Decoder frame failed"); 5820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 5821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_enable_android_native_buffers) 5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Unlock the buffer 5824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) { 5825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Releasing genlock failed"); 5826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 5827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 5828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev native_buffer[buffer - m_out_mem_ptr].inuse = false; 5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cb.FillBufferDone (hComp,m_app_data,buffer); 5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_output_buffers--; 5834e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 5835e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5836e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5837e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 5838e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 5839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 5841e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 5842e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::SetCallbacks 5843e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5844e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 5845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Set the callbacks. 5846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5847e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 5848e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 5849e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5850e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 5851e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if everything successful. 5852e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5853e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 5854e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 5855e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_CALLBACKTYPE* callbacks, 5856e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR appData) 5857e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 5858e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5859e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cb = *callbacks; 5860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 5861e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cb.EventHandler,m_cb.FillBufferDone); 5862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_app_data = appData; 5863e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNotImplemented; 5864e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 5865e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5866e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 5867e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 5868e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::ComponentDeInit 5869e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5870e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 5871e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Destroys the component and release memory allocated to the heap. 5872e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5873e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 5874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 5875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5876e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 5877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if everything successful. 5878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 5880e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 5881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 5882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 5883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(iDivXDrmDecrypt) 5884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete iDivXDrmDecrypt; 5886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt=NULL; 5887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 5889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly int i = 0; 5890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (OMX_StateLoaded != m_state) 5891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\ 5893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_state); 5894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED"); 5895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5896e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 5897e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5898e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n Playback Ended - PASSED"); 5899e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5901fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (secure_mode) { 5902fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (unsecureDisplay(qService::IQService::START) < 0) { 5903fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George DEBUG_PRINT_HIGH("Failed to send message to unsecure display START"); 5904fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 5905fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 5906fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 5907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Check if the output buffers have to be cleaned up*/ 5908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_out_mem_ptr) 5909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("Freeing the Output Memory\n"); 5911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (i=0; i < drv_ctx.op_buf.actualcount; i++ ) 5912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly free_output_buffer (&m_out_mem_ptr[i]); 5914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 5915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_enable_android_native_buffers) 5916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (native_buffer[i].inuse) 5918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) { 5920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Unlocking genlock failed"); 5921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev native_buffer[i].inuse = false; 5923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5926e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 5928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 5929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Check if the input buffers have to be cleaned up*/ 5933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_inp_mem_ptr || m_inp_heap_ptr) 5934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("Freeing the Input Memory\n"); 5936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (i=0; i<drv_ctx.ip_buf.actualcount; i++ ) 5937e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_mem_ptr) 5939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer (i,&m_inp_mem_ptr[i]); 5940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer (i,NULL); 5942e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer_header(); 5945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer_header(); 5946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(h264_scratch.pBuffer) 5947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(h264_scratch.pBuffer); 5949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer = NULL; 5950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (h264_parser) 5953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete h264_parser; 5955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser = NULL; 5956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_platform_list) 5959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly free(m_platform_list); 5961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_platform_list = NULL; 5962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_vendor_config.pData) 5964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 5965e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly free(m_vendor_config.pData); 5966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vendor_config.pData = NULL; 5967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 5968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly // Reset counters in mesg queues 5970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_ftb_q.m_size=0; 5971e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cmd_q.m_size=0; 5972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_etb_q.m_size=0; 5973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_ftb_q.m_read = m_ftb_q.m_write =0; 5974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cmd_q.m_read = m_cmd_q.m_write =0; 5975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_etb_q.m_read = m_etb_q.m_write =0; 5976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 5977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_debug_timestamp) 5978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_timestamp_list.reset_ts_list(); 5980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 5983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG"); 5984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 5985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly NULL); 5986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n Close the driver instance"); 5987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_ 5988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* get strong count gets the refernce count of the pmem, the count will 5989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * be incremented by our kernal driver and surface flinger, by the time 5990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * we close the pmem, this cound needs to be zero, but there is no way 5991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * for us to know when surface flinger reduces its cound, so we wait 5992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * here in a infinite loop till the count is zero 5993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev */ 5994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_heap_ptr) 5995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (int indx = 0; indx < drv_ctx.op_buf.actualcount; indx++) 5997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_ptr[indx].video_heap_ptr = NULL; 5998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_heap_ptr); 5999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_ptr = NULL; 6000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_count = 0; 6001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif // _ANDROID_ 6003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(drv_ctx.video_driver_fd); 6004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 6005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (inputBufferFile1); 6006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 6008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (outputBufferFile1); 6009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 6011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (outputExtradataFile); 6012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6013fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 6014fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (secure_mode) { 6015fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (unsecureDisplay(qService::IQService::END) < 0) { 6016fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George DEBUG_PRINT_HIGH("Failed to send message to unsecure display STOP"); 6017fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 6018fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 6019fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 6020e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete"); 6021e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 6022e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6023e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6024e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 6025e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 6026e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::UseEGLImage 6027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6028e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 6029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Use EGL Image method implementation <TBD>. 6030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6031e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 6032e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 6033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6034e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 6035e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Not Implemented error. 6036e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6037e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 6038e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 6039e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 6040e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 port, 6041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_PTR appData, 6042e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN void* eglImage) 6043e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list; 6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry; 6046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info; 6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 6049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc; 6050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev EGLint fd = -1, offset = 0,pmemPtr = 0; 6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int fd = -1, offset = 0; 6053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\nuse EGL image support for decoder"); 6055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) { 6056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n "); 6057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 6059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_display_id == NULL) { 6060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Display ID is not set by IL client \n"); 6061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 6062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC) 6064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eglGetProcAddress("eglQueryImageKHR"); 6065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd); 6066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset); 6067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr); 6068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app 6069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl { 6070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int pmem_fd; 6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int offset; 6072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }; 6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl *temp_egl_id = NULL; 6074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void * pmemPtr = (void *) eglImage; 6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_egl_id = (struct temp_egl *)eglImage; 6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (temp_egl_id != NULL) 6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = temp_egl_id->pmem_fd; 6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev offset = temp_egl_id->offset; 6080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (fd < 0) { 6083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d \n",fd); 6084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 6085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_info.pmem_fd = (OMX_U32) fd; 6087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_info.offset = (OMX_U32) offset; 6088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_entry.entry = (void *) &pmem_info; 6089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 6090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_list.entryList = &pmem_entry; 6091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_list.nEntries = 1; 6092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ouput_egl_buffers = true; 6093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port, 6094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void *)&pmem_list, drv_ctx.op_buf.buffer_size, 6095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_U8 *)pmemPtr)) { 6096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("use buffer call failed for egl image\n"); 6097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 6098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 6103e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 6104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::ComponentRoleEnum 6105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6106e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 6107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Component Role Enum method implementation. 6108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6109e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 6110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly <TBD>. 6111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6112e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 6113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX Error None if everything is successful. 6114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 6115e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 6116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_OUT OMX_U8* role, 6117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_IN OMX_U32 index) 6118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE eRet = OMX_ErrorNone; 6120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) 6122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((0 == index) && role) 6124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 6126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 6127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 6131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) 6134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((0 == index) && role) 6136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 6138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 6139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 6143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) 6146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if((0 == index) && role) 6148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 6150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 6151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n No more roles \n"); 6155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorNoMore; 6156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 6159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 6160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) 6161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 6162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 6163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) 6164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if((0 == index) && role) 6167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 6169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 6170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n No more roles \n"); 6174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorNoMore; 6175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) 6178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if((0 == index) && role) 6180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 6182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 6183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n No more roles \n"); 6187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorNoMore; 6188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 6191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 6192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 6193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if((0 == index) && role) 6195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 6197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 6198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n No more roles \n"); 6202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorNoMore; 6203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n"); 6208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly eRet = OMX_ErrorInvalidComponentName; 6209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return eRet; 6211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 6217e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 6218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::AllocateDone 6219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6220e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 6221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Checks if entire buffer pool is allocated by IL Client or not. 6222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Need this to move to IDLE state. 6223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6224e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 6225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 6226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6227e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 6228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false. 6229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 6231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_done(void) 6232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet = false; 6234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet_In = false; 6235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet_Out = false; 6236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet_In = allocate_input_done(); 6238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet_Out = allocate_output_done(); 6239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(bRet_In && bRet_Out) 6241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet = true; 6243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 6246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 6248e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 6249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::AllocateInputDone 6250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6251e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 6252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Checks if I/P buffer pool is allocated by IL Client or not. 6253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6254e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 6255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 6256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6257e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 6258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false. 6259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 6261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_input_done(void) 6262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet = false; 6264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned i=0; 6265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_inp_mem_ptr == NULL) 6267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 6269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_inp_mem_ptr ) 6271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(;i<drv_ctx.ip_buf.actualcount;i++) 6273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_ABSENT(&m_inp_bm_count,i)) 6275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(i == drv_ctx.ip_buf.actualcount) 6281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet = true; 6283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 6284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) 6286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_inp_bPopulated = OMX_TRUE; 6288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 6290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 6292e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 6293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::AllocateOutputDone 6294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6295e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 6296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Checks if entire O/P buffer pool is allocated by IL Client or not. 6297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6298e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 6299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 6300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6301e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 6302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false. 6303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 6305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::allocate_output_done(void) 6306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet = false; 6308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned j=0; 6309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_out_mem_ptr == NULL) 6311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 6313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_out_mem_ptr) 6316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(;j < drv_ctx.op_buf.actualcount;j++) 6318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_ABSENT(&m_out_bm_count,j)) 6320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(j == drv_ctx.op_buf.actualcount) 6327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet = true; 6329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 6330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_bEnabled) 6331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bPopulated = OMX_TRUE; 6332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 6335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 6338e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 6339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::ReleaseDone 6340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6341e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 6342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Checks if IL client has released all the buffers. 6343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6344e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 6345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 6346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6347e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 6348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 6349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 6351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_done(void) 6352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet = false; 6354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(release_input_done()) 6356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(release_output_done()) 6358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet = true; 6360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 6363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 6367e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 6368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::ReleaseOutputDone 6369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6370e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 6371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Checks if IL client has released all the buffers. 6372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6373e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 6374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 6375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6376e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 6377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 6378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 6380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_output_done(void) 6381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet = false; 6383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned i=0,j=0; 6384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr); 6386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_out_mem_ptr) 6387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(;j < drv_ctx.op_buf.actualcount ; j++) 6389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(BITMASK_PRESENT(&m_out_bm_count,j)) 6391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(j == drv_ctx.op_buf.actualcount) 6396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_bm_count = 0; 6398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet = true; 6399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_out_bm_count = 0; 6404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet = true; 6405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 6407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/* ====================================================================== 6409e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyFUNCTION 6410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec::ReleaseInputDone 6411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6412e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDESCRIPTION 6413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly Checks if IL client has released all the buffers. 6414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6415e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPARAMETERS 6416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly None. 6417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6418e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRETURN VALUE 6419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly true/false 6420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly========================================================================== */ 6422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::release_input_done(void) 6423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bool bRet = false; 6425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned i=0,j=0; 6426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 6428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(m_inp_mem_ptr) 6429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(;j<drv_ctx.ip_buf.actualcount;j++) 6431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if( BITMASK_PRESENT(&m_inp_bm_count,j)) 6433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(j==drv_ctx.ip_buf.actualcount) 6438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet = true; 6440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly bRet = true; 6445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return bRet; 6447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp, 6450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE * buffer) 6451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 6453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) 6455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer); 6457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (output_flush_progress) 6460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 6462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 6463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nTimeStamp = 0; 6464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 6467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 6470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev char value[PROPERTY_VALUE_MAX]; 6471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_get("vidc.dec.debug.panframedata", value, NULL); 6472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (atoi(value)) 6474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) 6476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n"); 6478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("***************************************************\n"); 6479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n"); 6480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("***************************************************\n"); 6481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) 6484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n"); 6486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("***************************************************\n"); 6487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n"); 6488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("***************************************************\n"); 6489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 6494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer, buffer->pBuffer); 6495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_output_buffers --; 6496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFlags & OMX_BUFFERFLAG_EOS) 6498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Output EOS has been reached"); 6500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!output_flush_progress) 6501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(NULL,NULL,OMX_COMPONENT_GENERATE_EOS_DONE); 6502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (psource_frame) 6504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 6506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame = NULL; 6507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pdest_frame) 6509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen = 0; 6511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL); 6512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame = NULL; 6513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer); 6517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 6518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (outputBufferFile1) 6519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6520edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George OMX_U32 index = buffer - m_out_mem_ptr; 6521edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr; 6522edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George 6523edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George fwrite (pBuffer,1,buffer->nFilledLen, 6524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev outputBufferFile1); 6525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* For use buffer we need to copy the data */ 6529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!output_flush_progress) 6530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.get_next_timestamp(buffer, 6532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 6533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ?true:false); 6534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_cb.FillBufferDone) 6536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFilledLen > 0) 6538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata) 6540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev handle_extradata(buffer); 6541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_TIMEINFO_EXTRADATA) 6542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Keep min timestamp interval to handle corrupted bit stream scenario 6543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev set_frame_rate(buffer->nTimeStamp); 6544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (arbitrary_bytes) 6545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev adjust_timestamp(buffer->nTimeStamp); 6546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 6547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (perf_flag) 6548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!proc_frms) 6550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.stop(); 6552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev latency = dec_time.processing_time_us() - latency; 6553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3); 6554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.start(); 6555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fps_metrics.start(); 6556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_frms++; 6558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFlags & OMX_BUFFERFLAG_EOS) 6559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U64 proc_time = 0; 6561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fps_metrics.stop(); 6562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_time = fps_metrics.processing_time_us(); 6563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)", 6564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_frms, (float)proc_time / 1e6, 6565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (float)(1e6 * proc_frms) / proc_time); 6566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_frms = 0; 6567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 6570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 6572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (outputExtradataFile) 6573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6575edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George OMX_U32 index = buffer - m_out_mem_ptr; 6576edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr; 6577edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George 6578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 6579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) 6580edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George ((unsigned)(pBuffer + buffer->nOffset + 6581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen + 3)&(~3)); 6582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(p_extra && 6583edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) ) 6584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType); 6586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fwrite (p_extra,1,p_extra->nSize,outputExtradataFile); 6587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_extra->eType == OMX_ExtraDataNone) 6588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 6592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFlags & OMX_BUFFERFLAG_EOS){ 6597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = LLONG_MAX; 6598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts = true; 6599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 6602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_QCOM_PLATFORM_PRIVATE_LIST *) 6603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->pPlatformPrivate)->entryList->entry; 6604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd); 6605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 6606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_enable_android_native_buffers) 6607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (native_buffer[buffer - m_out_mem_ptr].inuse) { 6609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) { 6610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Unlocking genlock failed"); 6611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 6612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 6614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev native_buffer[buffer - m_out_mem_ptr].inuse = false; 6615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 661940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George OMX_BUFFERHEADERTYPE *il_buffer; 662040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George il_buffer = client_buffers.get_il_buf_hdr(buffer); 662140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (il_buffer) 662240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_cb.FillBufferDone (hComp,m_app_data,il_buffer); 662340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George else { 662440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr"); 662540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorBadParameter; 662640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 662740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 6628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd); 6629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 6633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 6636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6638e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp, 6639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_BUFFERHEADERTYPE* buffer) 6640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) 6643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer); 6645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 6646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 6649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly buffer, buffer->pBuffer); 6650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pending_input_buffers--; 6651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (arbitrary_bytes) 6653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pdest_frame == NULL && input_flush_progress == false) 6655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer); 6657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame = buffer; 6658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly buffer->nFilledLen = 0; 6659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nTimeStamp = LLONG_MAX; 6660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly push_input_buffer (hComp); 6661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer); 6665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly buffer->nFilledLen = 0; 6666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (!m_input_free_q.insert_entry((unsigned)buffer,NULL,NULL)) 6667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error"); 6669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(m_cb.EmptyBufferDone) 6673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly buffer->nFilledLen = 0; 6675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (input_use_buffer == true){ 6676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 6677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 6679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 6681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint omx_vdec::async_message_process (void *context, void* message) 6685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_vdec* omx = NULL; 6687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_msginfo *vdec_msg = NULL; 6688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_BUFFERHEADERTYPE* omxhdr = NULL; 6689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct vdec_output_frameinfo *output_respbuf = NULL; 6690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (context == NULL || message == NULL) 6692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check"); 6694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return -1; 6695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly vdec_msg = (struct vdec_msginfo *)message; 6697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx = reinterpret_cast<omx_vdec*>(context); 6699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 6701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (omx->m_debug_timestamp) 6702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) && 6704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !(omx->output_flush_progress) ) 6705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_TICKS expected_ts = 0; 6707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->m_timestamp_list.pop_min_ts(expected_ts); 6708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list", 6709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.time_stamp, expected_ts); 6710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts) 6712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check"); 6714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly switch (vdec_msg->msgcode) 6720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VDEC_MSG_EVT_HW_ERROR: 6723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx->post_event (NULL,vdec_msg->status_code,\ 6724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 6725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VDEC_MSG_RESP_START_DONE: 6728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx->post_event (NULL,vdec_msg->status_code,\ 6729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_START_DONE); 6730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VDEC_MSG_RESP_STOP_DONE: 6733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx->post_event (NULL,vdec_msg->status_code,\ 6734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_STOP_DONE); 6735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VDEC_MSG_RESP_RESUME_DONE: 6738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx->post_event (NULL,vdec_msg->status_code,\ 6739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_RESUME_DONE); 6740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VDEC_MSG_RESP_PAUSE_DONE: 6743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx->post_event (NULL,vdec_msg->status_code,\ 6744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_PAUSE_DONE); 6745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 6748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx->post_event (NULL,vdec_msg->status_code,\ 6749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 6750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 6752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx->post_event (NULL,vdec_msg->status_code,\ 6753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 6754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VDEC_MSG_RESP_INPUT_FLUSHED: 6756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 6757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omxhdr = (OMX_BUFFERHEADERTYPE* )\ 6759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly vdec_msg->msgdata.input_frame_clientdata; 6760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (omxhdr == NULL || 6763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) 6764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omxhdr = NULL; 6766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly vdec_msg->status_code = VDEC_S_EFATAL; 6767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code, 6770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_COMPONENT_GENERATE_EBD); 6771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_EVT_INFO_FIELD_DROPPED: 6773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int64_t *timestamp; 6774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev timestamp = (int64_t *) malloc(sizeof(int64_t)); 6775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (timestamp) { 6776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *timestamp = vdec_msg->msgdata.output_frame.time_stamp; 6777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event ((unsigned int)timestamp, vdec_msg->status_code, 6778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED); 6779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld", 6780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.time_stamp); 6781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VDEC_MSG_RESP_OUTPUT_FLUSHED: 6784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 6785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omxhdr = (OMX_BUFFERHEADERTYPE*)vdec_msg->msgdata.output_frame.client_data; 6786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)", 6787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr, vdec_msg->msgdata.output_frame.time_stamp, 6788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.pic_type); 6789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* update SYNCFRAME flag */ 6791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (omx->eCompressionFormat == OMX_VIDEO_CodingAVC) 6792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* set SYNCFRAME flag if picture type is IDR for h264 */ 6794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_IDR) 6795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME; 6796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME; 6798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* set SYNCFRAME flag if picture type is I_TYPE */ 6802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_I) 6803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME; 6804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME; 6806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (omxhdr && omxhdr->pOutputPortPrivate && 6809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) && 6810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate 6811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) 6812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) 6814e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6815e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len; 6816e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset; 6817e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp; 6818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr->nFlags = (vdec_msg->msgdata.output_frame.flags); 6819e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6820e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly output_respbuf = (struct vdec_output_frameinfo *)\ 6821e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omxhdr->pOutputPortPrivate; 6822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_respbuf->framesize.bottom = 6823090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly vdec_msg->msgdata.output_frame.framesize.bottom; 6824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_respbuf->framesize.left = 6825090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly vdec_msg->msgdata.output_frame.framesize.left; 6826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_respbuf->framesize.right = 6827090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly vdec_msg->msgdata.output_frame.framesize.right; 6828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_respbuf->framesize.top = 6829090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly vdec_msg->msgdata.output_frame.framesize.top; 6830e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly output_respbuf->len = vdec_msg->msgdata.output_frame.len; 6831e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly output_respbuf->offset = vdec_msg->msgdata.output_frame.offset; 6832e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp; 6833e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly output_respbuf->flags = vdec_msg->msgdata.output_frame.flags; 6834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type; 6835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format; 6836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_respbuf->aspect_ratio_info = 6837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.aspect_ratio_info; 6838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6839e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6840e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (omx->output_use_buffer) 6841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ( omxhdr->pBuffer, 6842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (vdec_msg->msgdata.output_frame.bufferaddr + 6843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.offset), 6844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.len ); 6845e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6846e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6847e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omxhdr->nFilledLen = 0; 6848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code, 6849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_FBD); 6850e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) 6852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL, vdec_msg->status_code, 6853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EOS_DONE); 6854e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL, vdec_msg->status_code, 6856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 6857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_EVT_CONFIG_CHANGED: 6859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Port settings changed"); 6860e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code, 6861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_PORT_RECONFIG); 6862e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_EVT_INFO_CONFIG_CHANGED: 6864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Port settings changed info"); 6866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // get_buffer_req and populate port defn structure 6867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 6868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->m_port_def.nPortIndex = 1; 6869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = omx->update_portdef(&(omx->m_port_def)); 6870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code, 6871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG); 6872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6874e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly default: 6875e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6876e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6877e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return 1; 6878e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6879e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6880e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary ( 6881e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_HANDLETYPE hComp, 6882e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_BUFFERHEADERTYPE *buffer 6883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ) 6884e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned address,p2,id; 6886e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Empty this arbitrary"); 6887e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6888e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (buffer == NULL) 6889e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6890e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 6891e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6892e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 6893e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u", 6894e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp); 6895e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* return zero length and not an EOS buffer */ 6897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* return buffer if input flush in progress */ 6898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) && 6899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) 6900e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress"); 6902e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cb.EmptyBufferDone (hComp,m_app_data,buffer); 6903e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 6904e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6905e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6906e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (psource_frame == NULL) 6907e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6908e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp); 6909e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame = buffer; 6910e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Try to Push One Input Buffer "); 6911e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly push_input_buffer (hComp); 6912e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6913e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 6914e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6915e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer); 6916e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (!m_input_pending_q.insert_entry((unsigned)buffer,NULL,NULL)) 6917e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6918e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 6919e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6920e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6921e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6922e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6923e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 6924e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6925e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6926e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp) 6927e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6928e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned address,p2,id; 6929e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_ERRORTYPE ret = OMX_ErrorNone; 6930e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6931e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pdest_frame == NULL || psource_frame == NULL) 6932e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6933e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Check if we have a destination buffer*/ 6934e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pdest_frame == NULL) 6935e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6936e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue"); 6937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_free_q.m_size) 6938e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6939e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_input_free_q.pop_entry(&address,&p2,&id); 6940e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame = (OMX_BUFFERHEADERTYPE *)address; 6941e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen = 0; 6942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nTimeStamp = LLONG_MAX; 6943e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame); 6944e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6945e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6946e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6947e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Check if we have a destination buffer*/ 6948e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (psource_frame == NULL) 6949e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6950e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Get a source buffer from the queue"); 6951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_pending_q.m_size) 6952e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6953e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_input_pending_q.pop_entry(&address,&p2,&id); 6954e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame = (OMX_BUFFERHEADERTYPE *)address; 6955e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame, 6956e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame->nTimeStamp); 6957e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d", 6958e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame->nFlags,psource_frame->nFilledLen); 6959e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6960e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6961e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6962e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6963e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6964e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while ((pdest_frame != NULL) && (psource_frame != NULL)) 6966e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6967e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly switch (codec_type_parse) 6968e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6969e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case CODEC_TYPE_MPEG4: 6970e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case CODEC_TYPE_H263: 6971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case CODEC_TYPE_MPEG2: 6972e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ret = push_input_sc_codec(hComp); 6973e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6974e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case CODEC_TYPE_H264: 6975e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ret = push_input_h264(hComp); 6976e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6977e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case CODEC_TYPE_VC1: 6978e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly ret = push_input_vc1(hComp); 6979e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6980e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6981e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (ret != OMX_ErrorNone) 6982e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 6983e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed"); 6984e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly omx_report_error (); 6985e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 6986e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6987e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 6988e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6989e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return ret; 6990e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 6991e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6992e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp) 6993e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 6994e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U32 partial_frame = 1; 6995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BOOL generate_ebd = OMX_TRUE; 6996e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned address,p2,id; 6997e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 6998e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d", 6999e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame,psource_frame->nTimeStamp); 7000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.parse_sc_frame(psource_frame, 7001e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame,&partial_frame) == -1) 7002e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7003e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Error In Parsing Return Error"); 7004e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7005e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7006e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7007e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (partial_frame == 0) 7008e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7009e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d", 7010e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen,psource_frame,frame_count); 7011e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7012e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7013e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp); 7014e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*First Parsed buffer will have only header Hence skip*/ 7015e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (frame_count == 0) 7016e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7017e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame "); 7018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 7019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(codec_type_parse == CODEC_TYPE_MPEG4 || 7020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse == CODEC_TYPE_DIVX) { 7021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mp4StreamType psBits; 7022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset; 7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psBits.numBytes = pdest_frame->nFilledLen; 7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mp4_headerparser.parseHeader(&psBits); 7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7027e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frame_count++; 7028e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7029e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7030e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 7032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(pdest_frame->nFilledLen) 7033e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Push the frame to the Decoder*/ 7035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) 7036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_count++; 7040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = NULL; 7041e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_free_q.m_size) 7043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_free_q.pop_entry(&address,&p2,&id); 7045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 7046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen = 0; 7047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7048e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) 7050e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL"); 7052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL); 7053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = NULL; 7054e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7055e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7056e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7057e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7058e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7059e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen); 7060e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Check if Destination Buffer is full*/ 7061e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pdest_frame->nAllocLen == 7062e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen + pdest_frame->nOffset) 7063e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7064e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled"); 7065e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorStreamCorrupt; 7066e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7067e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7068e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7069e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (psource_frame->nFilledLen == 0) 7070e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) 7072e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7073e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pdest_frame) 7074e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags |= psource_frame->nFlags; 7076e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x", 7077e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 7078e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d", 7079e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen,frame_count++); 7080e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Push the frame to the Decoder*/ 7081e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) 7082e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7083e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7084e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7085e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frame_count++; 7086e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame = NULL; 7087e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7088e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7089e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7090e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Last frame in else dest addr") ; 7091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev generate_ebd = OMX_FALSE; 7092e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7093e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(generate_ebd) 7095e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7096e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame); 7097e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 7098e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame = NULL; 7099e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (m_input_pending_q.m_size) 7101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame); 7103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_input_pending_q.pop_entry(&address,&p2,&id); 7104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame = (OMX_BUFFERHEADERTYPE *) address; 7105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame, 7106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame->nTimeStamp); 7107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d", 7108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly psource_frame->nFlags,psource_frame->nFilledLen); 7109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 7113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 7114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7115e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp) 7116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 7117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U32 partial_frame = 1; 7118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly unsigned address,p2,id; 7119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_BOOL isNewFrame = OMX_FALSE; 7120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BOOL generate_ebd = OMX_TRUE; 7121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (h264_scratch.pBuffer == NULL) 7123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated"); 7125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d " 7128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal); 7129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 7130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (h264_scratch.nFilledLen && look_ahead_nal) 7131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly look_ahead_nal = false; 7133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 7134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly h264_scratch.nFilledLen) 7135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 7137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly h264_scratch.pBuffer,h264_scratch.nFilledLen); 7138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen += h264_scratch.nFilledLen; 7139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame"); 7140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly h264_scratch.nFilledLen = 0; 7141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264"); 7145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (nal_length == 0) 7149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code"); 7151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.parse_sc_frame(psource_frame, 7152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &h264_scratch,&partial_frame) == -1) 7153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error In Parsing Return Error"); 7155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length); 7161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.parse_h264_nallength(psource_frame, 7162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &h264_scratch,&partial_frame) == -1) 7163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error"); 7165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (partial_frame == 0) 7170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (nal_count == 0 && h264_scratch.nFilledLen == 0) 7172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip"); 7174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_count++; 7175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 7176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFlags = psource_frame->nFlags; 7177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen); 7181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(h264_scratch.nFilledLen) 7182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen, 7184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NALU_TYPE_SPS); 7185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 7186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_TIMEINFO_EXTRADATA) 7187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 7188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen, NALU_TYPE_SEI); 7189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 7190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // If timeinfo is present frame info from SEI is already processed 7191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 7192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen, NALU_TYPE_SEI); 7193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 7195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_count++; 7196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) { 7197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nTimeStamp = h264_last_au_ts; 7198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags = h264_last_au_flags; 7199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR 7200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 7201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->update_panscan_data(h264_last_au_ts); 7202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR || 7205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) { 7206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts = h264_scratch.nTimeStamp; 7207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_flags = h264_scratch.nFlags; 7208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 7209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_TIMEINFO_EXTRADATA) 7210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts); 7212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!VALID_TS(h264_last_au_ts)) 7213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts = ts_in_sei; 7214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else 7217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts = LLONG_MAX; 7218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!isNewFrame) 7221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 7223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen) 7224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d", 7226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen); 7227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 7228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer,h264_scratch.nFilledLen); 7229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += h264_scratch.nFilledLen; 7230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ) 7231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 7232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 7233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264"); 7237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev look_ahead_nal = true; 7243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x", 7244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 7245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d", 7246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen,frame_count++); 7247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pdest_frame->nFilledLen == 0) 7249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it"); 7251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev look_ahead_nal = false; 7252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 7253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen) 7254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 7256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer,h264_scratch.nFilledLen); 7257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen += h264_scratch.nFilledLen; 7258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly h264_scratch.nFilledLen = 0; 7259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264"); 7263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(psource_frame->nFilledLen || h264_scratch.nFilledLen) 7269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Reset the EOS Flag"); 7271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 7272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Push the frame to the Decoder*/ 7274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) 7275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //frame_count++; 7279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = NULL; 7280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_free_q.m_size) 7281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_free_q.pop_entry(&address,&p2,&id); 7283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 7284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame); 7285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen = 0; 7286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags = 0; 7287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nTimeStamp = LLONG_MAX; 7288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 7296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if Destination Buffer is full*/ 7297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (h264_scratch.nAllocLen == 7298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen + h264_scratch.nOffset) 7299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled"); 7301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorStreamCorrupt; 7302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!psource_frame->nFilledLen) 7306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame); 7308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) 7310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (pdest_frame) 7312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer"); 7314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 7315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly h264_scratch.nFilledLen) 7316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 7318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly h264_scratch.pBuffer,h264_scratch.nFilledLen); 7319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen += h264_scratch.nFilledLen; 7320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly h264_scratch.nFilledLen = 0; 7321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264"); 7325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 7328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 7329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P 7330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (frame_count == 0) 7331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("No frames sent to driver yet, " 7333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "So send zero length EOS buffer"); 7334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen = 0; 7335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("pdest_frame->nFilledLen = %d, nFlags = 0x%x, TimeStamp = %x", 7338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen, pdest_frame->nFlags, pdest_frame->nTimeStamp); 7339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++); 7340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 7341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_TIMEINFO_EXTRADATA) 7342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp); 7344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!VALID_TS(pdest_frame->nTimeStamp)) 7345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nTimeStamp = ts_in_sei; 7346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly /*Push the frame to the Decoder*/ 7349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) 7350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly frame_count++; 7354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame = NULL; 7355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d", 7359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame,h264_scratch.nFilledLen); 7360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev generate_ebd = OMX_FALSE; 7361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(generate_ebd && !psource_frame->nFilledLen) 7365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 7367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame = NULL; 7368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_pending_q.m_size) 7369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame); 7371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_pending_q.pop_entry(&address,&p2,&id); 7372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame = (OMX_BUFFERHEADERTYPE *) address; 7373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d", 7374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame->nFlags,psource_frame->nFilledLen); 7375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 7378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 7379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7380e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp) 7381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 7382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U8 *buf, *pdest; 7383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U32 partial_frame = 1; 7384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U32 buf_len, dest_len; 7385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(first_frame == 0) 7387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev first_frame = 1; 7389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n"); 7390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(!m_vendor_config.pData) 7391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n"); 7393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly buf = psource_frame->pBuffer; 7394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly buf_len = psource_frame->nFilledLen; 7395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) == 7397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly VC1_SP_MP_START_CODE) 7398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vc1_profile = VC1_SP_MP_RCV; 7400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) 7402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly m_vc1_profile = VC1_AP; 7404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n"); 7408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorStreamCorrupt; 7409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen + 7414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nOffset; 7415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen + 7416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nOffset); 7417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if(dest_len < m_vendor_config.nDataSize) 7419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\nDestination buffer full\n"); 7421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly else 7424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize); 7426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly pdest_frame->nFilledLen += m_vendor_config.nDataSize; 7427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly switch(m_vc1_profile) 7432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VC1_AP: 7434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code"); 7435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (push_input_sc_codec(hComp) != OMX_ErrorNone) 7436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code"); 7438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly break; 7441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly case VC1_SP_MP_RCV: 7443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly default: 7444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode\n"); 7445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorBadParameter; 7446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return OMX_ErrorNone; 7448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 7449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 7450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION 7451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 7452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly OMX_U32 alignment) 7453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{ 7454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly struct pmem_allocation allocation; 7455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly allocation.size = buffer_size; 7456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly allocation.align = clip2(alignment); 7457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (allocation.align < 4096) 7458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly allocation.align = 4096; 7460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) 7462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly { 7463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)", 7464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev allocation.align, allocation.size); 7465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return false; 7466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly } 7467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly return true; 7468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7469090b8e2b897c4f59d0bbafe983390c2e22c972feNick Pelly#endif 7470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size, 7473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 alignment, struct ion_allocation_data *alloc_data, 7474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct ion_fd_data *fd_data,int flag) 7475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int fd = -EINVAL; 7477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc = -EINVAL; 7478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ion_dev_flag; 7479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ion ion_buf_info; 7480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!alloc_data || buffer_size <= 0 || !fd_data) { 7481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n"); 7482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -EINVAL; 7483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode && flag == CACHED) 7485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_dev_flag = O_RDONLY; 7487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 7488e1b75ccf790ae63be6a99f617a1927d1e003cac9Haynes Mathew George ion_dev_flag = (O_RDONLY | O_DSYNC); 7489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = open (MEM_DEVICE, ion_dev_flag); 7491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (fd < 0) { 7492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd); 7493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 7494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->len = buffer_size; 7496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->align = clip2(alignment); 7497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (alloc_data->align < 4096) 7498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->align = 4096; 7500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(secure_mode) { 7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->flags = (ION_HEAP(MEM_HEAP_ID) | ION_SECURE); 7503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 7504a370c157f9ab6a5d4576820acd09dd4239879ffaHaynes Mathew George alloc_data->flags = (ION_HEAP(ION_IOMMU_HEAP_ID)); 7505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 7507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc || !alloc_data->handle) { 7508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ION ALLOC memory failed "); 7509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->handle = NULL; 7510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(fd); 7511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = -ENOMEM; 7512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 7513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd_data->handle = alloc_data->handle; 7515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(fd,ION_IOC_MAP,fd_data); 7516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 7517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ION MAP failed "); 7518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_buf_info.ion_alloc_data = *alloc_data; 7519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_buf_info.ion_device_fd = fd; 7520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_buf_info.fd_ion_data = *fd_data; 7521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&ion_buf_info); 7522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd_data->fd =-1; 7523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(fd); 7524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = -ENOMEM; 7525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 7528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) { 7531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!buf_ion_info) { 7533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata"); 7534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return; 7535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 7537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &buf_ion_info->ion_alloc_data.handle)) { 7538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ION: free failed" ); 7539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(buf_ion_info->ion_device_fd); 7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_ion_info->ion_device_fd = -1; 7542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_ion_info->ion_alloc_data.handle = NULL; 7543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_ion_info->fd_ion_data.fd = -1; 7544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header() 7547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released"); 7549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_use_buffer = false; 7550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ouput_egl_buffers = false; 7551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_out_mem_ptr) 7553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (m_out_mem_ptr); 7555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr = NULL; 7556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_platform_list) 7559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_platform_list); 7561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = NULL; 7562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_respbuffer) 7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (drv_ctx.ptr_respbuffer); 7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer = NULL; 7568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_outputbuffer) 7570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (drv_ctx.ptr_outputbuffer); 7572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer = NULL; 7573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 7576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free o/p ion context"); 7577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.op_buf_ion_info); 7578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 7579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header() 7584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_use_buffer = false; 7586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 7587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.mutils) 7589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free utils parser"); 7591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete (m_frame_parser.mutils); 7592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils = NULL; 7593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_heap_ptr) 7596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free input Heap Pointer"); 7598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (m_inp_heap_ptr); 7599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr = NULL; 7600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_phdr_pmem_ptr) 7603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free input pmem header Pointer"); 7605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (m_phdr_pmem_ptr); 7606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_phdr_pmem_ptr = NULL; 7607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_mem_ptr) 7610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free input pmem Pointer area"); 7612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (m_inp_mem_ptr); 7613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_mem_ptr = NULL; 7614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_inputbuffer) 7616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free Driver Context pointer"); 7618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (drv_ctx.ptr_inputbuffer); 7619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer = NULL; 7620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ip_buf_ion_info) { 7623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free ion context"); 7624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.ip_buf_ion_info); 7625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info = NULL; 7626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop) 7631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 7633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int buf_size = 0, extra_data_size = 0; 7635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)", 7636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->actualcount, buffer_prop->buffer_size); 7637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = NULL; 7638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = buffer_prop; 7639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_GET_BUFFER_REQ, 7640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < 0) 7641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 7643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 7644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_size = buffer_prop->buffer_size; 7648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 7649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Frame info extra data enabled!"); 7651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE; 7652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_INTERLACE_EXTRADATA) 7654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Interlace extra data enabled!"); 7656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE; 7657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_PORTDEF_EXTRADATA) 7659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE; 7661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n", 7662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data_size); 7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (extra_data_size) 7665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator 7667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit 7668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_size += extra_data_size; 7670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 7671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)", 7672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->actualcount, buffer_prop->buffer_size, buf_size); 7673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (in_reconfig) // BufReq will be set to driver when port is disabled 7674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->buffer_size = buf_size; 7675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (buf_size != buffer_prop->buffer_size) 7676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->buffer_size = buf_size; 7678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = set_buffer_req(buffer_prop); 7679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)", 7682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->actualcount, buffer_prop->buffer_size); 7683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop) 7687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 7689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned buf_size = 0; 7691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)", 7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->actualcount, buffer_prop->buffer_size); 7693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 7694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buf_size != buffer_prop->buffer_size) 7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)", 7697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->buffer_size, buf_size); 7698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = buffer_prop; 7703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 7704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_BUFFER_REQ, 7705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < 0) 7706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setting buffer requirements failed"); 7708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 770940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } else { 771040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!client_buffers.update_buffer_req()) { 771140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed"); 771240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George eRet = OMX_ErrorInsufficientResources; 771340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 7714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::start_port_reconfig() 7720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 7722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = update_picture_resolution(); 7724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) 7725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = &drv_ctx.interlace; 7727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_INTERLACE_FORMAT, &ioctl_msg)) 7728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_INTERLACE_FORMAT"); 7730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 7731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 7735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Interlace format detected (%x)!", drv_ctx.interlace); 7737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) 7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev client_extradata |= OMX_INTERLACE_EXTRADATA; 7739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 7740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("secure mode interlaced format not supported"); 7741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 7742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev in_reconfig = true; 7745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 7746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = get_buffer_req(&op_buf_rcnfg); 7747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution() 7753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 7755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = NULL; 7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = &drv_ctx.video_resolution; 7758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg)) 7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES"); 7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 7762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 7767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!portDefn) 7770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("omx_vdec::update_portdef\n"); 7774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nSize = sizeof(portDefn); 7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->eDomain = OMX_PortDomainVideo; 7777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.frame_rate.fps_denominator > 0) 7778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator / 7779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_denominator; 7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 7781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: Divide by zero \n"); 7782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (0 == portDefn->nPortIndex) 7785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->eDir = OMX_DirInput; 7787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 7788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 7789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 7790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused; 7791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.eCompressionFormat = eCompressionFormat; 7792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->bEnabled = m_inp_bEnabled; 7793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->bPopulated = m_inp_bPopulated; 7794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (1 == portDefn->nPortIndex) 7796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->eDir = OMX_DirOutput; 7798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (update_picture_resolution() != OMX_ErrorNone) 7799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ALOGE(" update_picture_resolution failed \n"); 7801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorHardware; 7802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 780340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!client_buffers.update_buffer_req()) { 780440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed"); 780540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorHardware; 780640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 7807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (in_reconfig) 7808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountActual = op_buf_rcnfg.actualcount; 7810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountMin = op_buf_rcnfg.mincount; 7811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferSize = op_buf_rcnfg.buffer_size; 7812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 7816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 7817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferSize = drv_ctx.op_buf.buffer_size; 7818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 781940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George unsigned int buf_size = 0; 782040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!client_buffers.get_buffer_req(buf_size)) { 782140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n update buffer requirements"); 782240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorHardware; 782340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 782440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George portDefn->nBufferSize = buf_size; 7825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 7826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->bEnabled = m_out_bEnabled; 7827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->bPopulated = m_out_bPopulated; 782840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) { 782940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Error in getting color format"); 783040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorHardware; 7831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->eDir = OMX_DirMax; 7836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 7837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (int)portDefn->nPortIndex); 7838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 7839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height; 7841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width; 7842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nStride = drv_ctx.video_resolution.stride; 7843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines; 7844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("update_portdef Width = %d Height = %d Stride = %u" 7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "SliceHeight = %u \n", portDefn->format.video.nFrameHeight, 7846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth, 7847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nStride, 7848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nSliceHeight); 7849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers() 7854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *bufHdr = NULL; 7857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i= 0; 7858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_out_mem_ptr) { 7860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation"); 7861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nBufHdrSize = 0; 7862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPlatformEntrySize = 0; 7863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPlatformListSize = 0; 7864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPMEMInfoSize = 0; 7865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 7866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 7867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 7868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n", 7870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 7871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nBufHdrSize = drv_ctx.op_buf.actualcount * 7872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_BUFFERHEADERTYPE); 7873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPMEMInfoSize = drv_ctx.op_buf.actualcount * 7875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 7876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformListSize = drv_ctx.op_buf.actualcount * 7877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 7878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformEntrySize = drv_ctx.op_buf.actualcount * 7879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 7880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize, 7882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_BUFFERHEADERTYPE), 7883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPMEMInfoSize, 7884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformListSize); 7885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize, 7886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bm_count); 7887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Alloc mem for platform specific info 7889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev char *pPtr=NULL; 7890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 7891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPMEMInfoSize,1); 7892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \ 7893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof(struct vdec_bufferpayload), 7894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 7895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 7896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof (struct vdec_output_frameinfo), 7897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 7898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \ 7900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount); 7901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 7904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && drv_ctx.ptr_respbuffer) 7905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr = m_out_mem_ptr; 7907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 7908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 7909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (((char *) m_platform_list) + nPlatformListSize); 7910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 7911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (((char *) m_platform_entry) + nPlatformEntrySize); 7912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList = m_platform_list; 7913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry = m_platform_entry; 7914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo = m_pmem_info; 7915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr); 7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Settting the entire storage nicely 7919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, 7920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr,pPlatformEntry); 7921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo); 7922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i < drv_ctx.op_buf.actualcount ; i++) 7923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 7925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 7926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Set the values when we determine the right HxW param 7927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nAllocLen = 0; 7928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nFilledLen = 0; 7929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pAppPrivate = NULL; 7930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 7931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 7932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry->entry = pPMEMInfo; 7933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Initialize the Platform List 7934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList->nEntries = 1; 7935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList->entryList = pPlatformEntry; 7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Keep pBuffer NULL till vdec is opened 7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pBuffer = NULL; 7938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo->offset = 0; 7939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo->pmem_fd = 0; 7940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pPlatformPrivate = pPlatformList; 7941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 7942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 7944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Create a mapping between buffers*/ 7946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 7947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 7948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.ptr_outputbuffer[i]; 7949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Move the buffer and buffer header pointers 7950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr++; 7951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo++; 7952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry++; 7953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList++; 7954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\ 7959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr, pPtr); 7960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_mem_ptr) 7961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_out_mem_ptr); 7963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr = NULL; 7964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(pPtr) 7966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(pPtr); 7968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPtr = NULL; 7969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_outputbuffer) 7971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.ptr_outputbuffer); 7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer = NULL; 7974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_respbuffer) 7976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.ptr_respbuffer); 7978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer = NULL; 7979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free o/p ion context"); 7983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.op_buf_ion_info); 7984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 7985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 7988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 7990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 7991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs() 7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned p1; 7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned p2; 7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned ident; 8000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_cmd_queue tmp_q, pending_bd_q; 8001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_lock(&m_lock); 8002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // pop all pending GENERATE FDB from ftb queue 8003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (m_ftb_q.m_size) 8004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.pop_entry(&p1,&p2,&ident); 8006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ident == OMX_COMPONENT_GENERATE_FBD) 8007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_bd_q.insert_entry(p1,p2,ident); 8009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev tmp_q.insert_entry(p1,p2,ident); 8013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //return all non GENERATE FDB to ftb queue 8016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(tmp_q.m_size) 8017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev tmp_q.pop_entry(&p1,&p2,&ident); 8019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.insert_entry(p1,p2,ident); 8020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // pop all pending GENERATE EDB from etb queue 8022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (m_etb_q.m_size) 8023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.pop_entry(&p1,&p2,&ident); 8025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ident == OMX_COMPONENT_GENERATE_EBD) 8026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_bd_q.insert_entry(p1,p2,ident); 8028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev tmp_q.insert_entry(p1,p2,ident); 8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //return all non GENERATE FDB to etb queue 8035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(tmp_q.m_size) 8036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev tmp_q.pop_entry(&p1,&p2,&ident); 8038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.insert_entry(p1,p2,ident); 8039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_unlock(&m_lock); 8041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // process all pending buffer dones 8042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(pending_bd_q.m_size) 8043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_bd_q.pop_entry(&p1,&p2,&ident); 8045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch(ident) 8046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_EBD: 8048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) 8049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n"); 8051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_report_error (); 8052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 8054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_FBD: 8056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) 8057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n"); 8059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_report_error (); 8060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 8062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp) 8067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 new_frame_interval = 0; 8069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 8070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 8071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) 8072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev new_frame_interval = (act_timestamp > prev_ts)? 8074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev act_timestamp - prev_ts : 8075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts - act_timestamp; 8076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (new_frame_interval < frm_int || frm_int == 0) 8077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int = new_frame_interval; 8079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(frm_int) 8080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator = 1e6; 8082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_denominator = frm_int; 8083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)", 8084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int, drv_ctx.frame_rate.fps_numerator / 8085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (float)drv_ctx.frame_rate.fps_denominator); 8086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.frame_rate; 8087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE, 8088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < 0) 8089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setting frame rate failed"); 8091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = act_timestamp; 8096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp) 8099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rst_prev_ts && VALID_TS(act_timestamp)) 8101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = act_timestamp; 8103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts = false; 8104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (VALID_TS(prev_ts)) 8106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool codec_cond = (drv_ctx.timestamp_adjust)? 8108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)? 8109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)): 8110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!VALID_TS(act_timestamp) || act_timestamp == prev_ts); 8111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(frm_int > 0 && codec_cond) 8112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 8114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev act_timestamp = prev_ts + frm_int; 8115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 8116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = act_timestamp; 8117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev set_frame_rate(act_timestamp); 8120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (frm_int > 0) // In this case the frame rate was set along 8122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { // with the port definition, start ts with 0 8123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 8124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts = true; 8125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 8129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL; 8131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 num_conceal_MB = 0; 8132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 ts_in_sei = 0; 8133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 frame_rate = 0; 8134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8135edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George OMX_U32 index = p_buf_hdr - m_out_mem_ptr; 8136edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr; 8137edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George 8138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) 8139edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George ((unsigned)(pBuffer + p_buf_hdr->nOffset + 8140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFilledLen + 3)&(~3)); 8141edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen)) 8142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = NULL; 8143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)) 8144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Process driver extradata 8146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE) 8147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)", 8149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize); 8150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_extra->nSize < p_extra->nDataSize) 8151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d", 8153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->nSize, p_extra->nDataSize); 8154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 8155edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) || 8156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->nDataSize == 0 || p_extra->nSize == 0) 8157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = NULL; 8158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev continue; 8159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP) 8161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 8163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev num_conceal_MB = count_MB_in_extradata(p_extra); 8164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP) 8165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Map driver extradata to corresponding OMX type 8166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB; 8167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client 8169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 8170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_debug_concealedmb) { 8171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB); 8172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */ 8174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (p_extra->eType == VDEC_EXTRADATA_SEI) 8176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_sei = p_extra; 8178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 8179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI); 8180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client 8182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (p_extra->eType == VDEC_EXTRADATA_VUI) 8184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_vui = p_extra; 8186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 8187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false); 8188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client 8190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev print_debug_extradata(p_extra); 8192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 8193edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen) || 8194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->nDataSize == 0 || p_extra->nSize == 0) 8195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = NULL; 8196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)) 8198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Driver extradata is only exposed if MB map is requested by client, 8200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // otherwise can be overwritten by omx extradata. 8201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) 8202edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George ((unsigned)(pBuffer + p_buf_hdr->nOffset + 8203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFilledLen + 3)&(~3)); 8204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 8205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT 8209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 8210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_TIMEINFO_EXTRADATA) 8212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_vui) 8214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false); 8215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_sei) 8216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI); 8217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp); 8218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!VALID_TS(p_buf_hdr->nTimeStamp)) 8219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nTimeStamp = ts_in_sei; 8220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei) 8222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // If timeinfo is present frame info from SEI is already processed 8223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI); 8224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra && 8227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) < 8228edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George (pBuffer + p_buf_hdr->nAllocLen)) 8229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 8231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev append_interlace_extradata(p_extra, 8232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format); 8233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 8234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra && 8236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) < 8237edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George (pBuffer + p_buf_hdr->nAllocLen)) 8238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 8240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* vui extra data (frame_rate) information */ 8241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (h264_parser) 8242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->get_frame_rate(&frame_rate); 8243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev append_frame_info_extradata(p_extra, num_conceal_MB, 8244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, 8245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nTimeStamp, frame_rate, 8246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &((struct vdec_output_frameinfo *) 8247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info); 8248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 8249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((client_extradata & OMX_PORTDEF_EXTRADATA) && 8251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra != NULL && 8252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) < 8253edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George (pBuffer + p_buf_hdr->nAllocLen)) 8254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 8256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev append_portdef_extradata(p_extra); 8257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 8258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA) 8260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_extra && 8261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) < 8262edf642ef561acbcba2dc54e5033d89939d470eb5Haynes Mathew George (pBuffer + p_buf_hdr->nAllocLen)) 8263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev append_terminator_extradata(p_extra); 8264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added"); 8267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 8268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable) 8272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE ret = OMX_ErrorNone; 8274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 driver_extradata = 0, extradata_size = 0; 8275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 8276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state != OMX_StateLoaded) 8277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 8279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 8280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) 8282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE; 8283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (requested_extradata & OMX_INTERLACE_EXTRADATA) 8284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extradata_size += OMX_INTERLACE_EXTRADATA_SIZE; 8285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (requested_extradata & OMX_PORTDEF_EXTRADATA) 8286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extradata_size += OMX_PORTDEF_EXTRADATA_SIZE; 8288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]", 8290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev client_extradata, requested_extradata, enable); 8291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (enable) 8293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev requested_extradata |= client_extradata; 8294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev requested_extradata = client_extradata & ~requested_extradata; 8297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extradata_size *= -1; 8298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK; 8301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) 8302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info 8303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT 8304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 8305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)? 8307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info 8308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)? 8309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info 8310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (driver_extradata != drv_ctx.extradata) 8314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev client_extradata = requested_extradata; 8316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.extradata = driver_extradata; 8317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.extradata; 8318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 8319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA, 8320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < 0) 8321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nSet extradata failed"); 8323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = OMX_ErrorUnsupportedSetting; 8324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = get_buffer_req(&drv_ctx.op_buf); 8327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK)) 8329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev client_extradata = requested_extradata; 8331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size += extradata_size; 8332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // align the buffer size 8333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size = (drv_ctx.op_buf.buffer_size + drv_ctx.op_buf.alignment - 1)&(~(drv_ctx.op_buf.alignment - 1)); 8334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d\n", drv_ctx.op_buf.buffer_size); 8335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator 8336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE); 8337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = set_buffer_req(&drv_ctx.op_buf); 8338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 8340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra) 8343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0; 8345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *data_ptr = extra->data, data = 0; 8346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (byte_count < extra->nDataSize) 8347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev data = *data_ptr; 8349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (data) 8350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev num_MB += (data&0x01); 8352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev data >>= 1; 8353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev data_ptr++; 8355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_count++; 8356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 8358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (drv_ctx.video_resolution.frame_height + 15)) >> 8; 8359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0); 8360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra) 8363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 8365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_debug_extradata) 8366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return; 8367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 8369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "============== Extra Data ==============\n" 8370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Size: %u \n" 8371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Version: %u \n" 8372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " PortIndex: %u \n" 8373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Type: %x \n" 8374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " DataSize: %u \n", 8375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nSize, extra->nVersion.nVersion, 8376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nPortIndex, extra->eType, extra->nDataSize); 8377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (extra->eType == OMX_ExtraDataInterlaceFormat) 8379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data; 8381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 8382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "------ Interlace Format ------\n" 8383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Size: %u \n" 8384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Version: %u \n" 8385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " PortIndex: %u \n" 8386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Is Interlace Format: %u \n" 8387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Interlace Formats: %u \n" 8388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "=========== End of Interlace ===========\n", 8389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex, 8390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev intfmt->bInterlaceFormat, intfmt->nInterlaceFormats); 8391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (extra->eType == OMX_ExtraDataFrameInfo) 8393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 8395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 8397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "-------- Frame Format --------\n" 8398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Picture Type: %u \n" 8399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Interlace Type: %u \n" 8400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Pan Scan Total Frame Num: %u \n" 8401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Concealed Macro Blocks: %u \n" 8402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " frame rate: %u \n" 8403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Aspect Ratio X: %u \n" 8404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Aspect Ratio Y: %u \n", 8405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->ePicType, 8406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->interlaceType, 8407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->panScan.numWindows, 8408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->nConcealedMacroblocks, 8409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->nFrameRate, 8410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->aspectRatio.aspectRatioX, 8411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->aspectRatio.aspectRatioY); 8412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (int i = 0; i < fminfo->panScan.numWindows; i++) 8414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 8416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "------------------------------\n" 8417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Pan Scan Frame Num: %d \n" 8418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Rectangle x: %d \n" 8419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Rectangle y: %d \n" 8420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Rectangle dx: %d \n" 8421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Rectangle dy: %d \n", 8422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y, 8423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy); 8424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("========= End of Frame Format =========="); 8427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (extra->eType == OMX_ExtraDataNone) 8429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("========== End of Terminator ==========="); 8431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("======= End of Driver Extradata ========"); 8435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */ 8437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 8440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 interlaced_format_type) 8441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_STREAMINTERLACEFORMAT *interlace_format; 8443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 mbaff = 0; 8444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE; 8445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nVersion.nVersion = OMX_SPEC_VERSION; 8446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 8447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat; 8448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT); 8449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data; 8450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT); 8451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->nVersion.nVersion = OMX_SPEC_VERSION; 8452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 8453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mbaff = (h264_parser)? (h264_parser->is_mbaff()): false; 8454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((interlaced_format_type == VDEC_InterlaceFrameProgressive) && !mbaff) 8455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->bInterlaceFormat = OMX_FALSE; 8457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 8458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 8459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->bInterlaceFormat = OMX_TRUE; 8463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; 8464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 8465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev print_debug_extradata(extra); 8467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 8470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp, 8471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 frame_rate, struct vdec_aspectratioinfo *aspect_ratio_info) 8472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL; 8474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE; 8475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nVersion.nVersion = OMX_SPEC_VERSION; 8476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 8477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo; 8478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO); 8479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 8480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch (picture_type) 8482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case PICTURE_TYPE_I: 8484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->ePicType = OMX_VIDEO_PictureTypeI; 8485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 8486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case PICTURE_TYPE_P: 8487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->ePicType = OMX_VIDEO_PictureTypeP; 8488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 8489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case PICTURE_TYPE_B: 8490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->ePicType = OMX_VIDEO_PictureTypeB; 8491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 8492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 8493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0; 8494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 8496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 8497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 8498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 8499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive; 8501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&frame_info->panScan,0,sizeof(frame_info->panScan)); 8502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio)); 8503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 8504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp); 8506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fill_aspect_ratio_info(aspect_ratio_info, frame_info); 8509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->nConcealedMacroblocks = num_conceal_mb; 8510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->nFrameRate = frame_rate; 8511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev print_debug_extradata(extra); 8512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::fill_aspect_ratio_info( 8515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_aspectratioinfo *aspect_ratio_info, 8516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info) 8517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_extradata = frame_info; 8519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_extradata->aspectRatio.aspectRatioX = 0; 8521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_extradata->aspectRatio.aspectRatioY = 0; 8522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 8524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->fill_aspect_ratio_info(&m_extradata->aspectRatio); 8526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 8528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG4 || 8529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_3 || 8530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4 || 8531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5 || 8532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_6) 8533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mp4_fill_aspect_ratio_info(aspect_ratio_info,m_extradata); 8535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_extradata->aspectRatio.aspectRatioX == 0 || 8538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_extradata->aspectRatio.aspectRatioY == 0) { 8539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_extradata->aspectRatio.aspectRatioX = 1; 8540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_extradata->aspectRatio.aspectRatioY = 1; 8541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra) 8545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL; 8547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE; 8548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nVersion.nVersion = OMX_SPEC_VERSION; 8549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 8550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef; 8551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 8552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data; 8553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *portDefn = m_port_def; 8554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u" 8555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "sliceheight = %u \n",portDefn->format.video.nFrameHeight, 8556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth, 8557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nStride, 8558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nSliceHeight); 8559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra) 8562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE); 8564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nVersion.nVersion = OMX_SPEC_VERSION; 8565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->eType = OMX_ExtraDataNone; 8566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nDataSize = 0; 8567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->data[0] = 0; 8568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev print_debug_extradata(extra); 8570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index) 8573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 8575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (index >= drv_ctx.ip_buf.actualcount) 8576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found"); 8578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_desc_buffer_ptr == NULL) 8581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_desc_buffer_ptr = (desc_buffer_hdr*) \ 8583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(desc_buffer_hdr)), 8584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount); 8585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_desc_buffer_ptr == NULL) 8586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed "); 8588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8)); 8593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_desc_buffer_ptr[index].buf_addr == NULL) 8594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed "); 8596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 8600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset) 8603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries); 8605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_demux_entries < 8192) 8606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_offsets[m_demux_entries++] = address_offset; 8608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return; 8610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr) 8613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 bytes_to_parse = buf_hdr->nFilledLen; 8615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset; 8616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 index = 0; 8617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries = 0; 8619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (index < bytes_to_parse) 8621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 8623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) || 8624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 8625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (buf[index+2] == 0x01)) ) 8626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //Found start code, insert address offset 8628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev insert_demux_addr_offset(index); 8629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buf[index+2] == 0x01) // 3 byte start code 8630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev index += 3; 8631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else //4 byte start code 8632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev index += 4; 8633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev index++; 8636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries); 8638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return; 8639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr) 8642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //fix this, handle 3 byte start code, vc1 terminator entry 8644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *p_demux_data = NULL; 8645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 desc_data = 0; 8646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 start_addr = 0; 8647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 nal_size = 0; 8648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 suffix_byte = 0; 8649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 demux_index = 0; 8650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 buffer_index = 0; 8651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_desc_buffer_ptr == NULL) 8653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries."); 8655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 8656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 8659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer_index > drv_ctx.ip_buf.actualcount) 8660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%d)", buffer_index); 8662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 8663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr; 8666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( ((OMX_U8*)p_demux_data == NULL) || 8668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) 8669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries."); 8671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 8672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (; demux_index < m_demux_entries; demux_index++) 8676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data = 0; 8678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev start_addr = m_demux_offsets[demux_index]; 8679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) 8680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3]; 8682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4]; 8686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (demux_index < (m_demux_entries - 1)) 8688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2; 8690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2; 8694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)", 8696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev start_addr, 8697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev suffix_byte, 8698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_size, 8699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev demux_index); 8700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data = (start_addr >> 3) << 1; 8701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data |= (start_addr & 7) << 21; 8702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data |= suffix_byte << 24; 8703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 8705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32)); 8706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 8707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 8708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_demux_data += 16; 8710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (codec_type_parse == CODEC_TYPE_VC1) 8712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("VC1 terminator entry"); 8714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data = 0; 8715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data = 0x82 << 24; 8716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 8717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data + 4, 0, sizeof(OMX_U32)); 8718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 8719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 8720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_demux_data += 16; 8721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries++; 8722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //Add zero word to indicate end of descriptors 8724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data, 0, sizeof(OMX_U32)); 8725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32); 8727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size); 8728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 8730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries = 0; 8731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Demux table complete!"); 8732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 8733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P 8736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::vdec_alloc_h264_mv() 8737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 pmem_fd = -1; 8739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 width, height, size, alignment; 8740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void *buf_addr = NULL; 8741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg; 8742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef USE_ION 8743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct pmem_allocation allocation; 8744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_h264_mv h264_mv; 8746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_mv_buff_size mv_buff_size; 8747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mv_buff_size.width = drv_ctx.video_resolution.stride; 8749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mv_buff_size.height = drv_ctx.video_resolution.scan_lines>>2; 8750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = NULL; 8752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = (void*)&mv_buff_size; 8753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_GET_MV_BUFFER_SIZE, (void*)&ioctl_msg) < 0) 8755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n GET_MV_BUFFER_SIZE Failed for width: %d, Height %d" , 8757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mv_buff_size.width, mv_buff_size.height); 8758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("GET_MV_BUFFER_SIZE returned: Size: %d and alignment: %d", 8762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mv_buff_size.size, mv_buff_size.alignment); 8763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev size = mv_buff_size.size * drv_ctx.op_buf.actualcount; 8765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alignment = mv_buff_size.alignment; 8766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Entered vdec_alloc_h264_mv act_width: %d, act_height: %d, size: %d, alignment %d\n", 8768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height,size,alignment); 8769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 8772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.h264_mv.ion_device_fd = alloc_map_ion_memory( 8773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev size, 8192, 8774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.h264_mv.ion_alloc_data, 8775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.h264_mv.fd_ion_data,CACHED); 8776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.h264_mv.ion_device_fd < 0) { 8777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = drv_ctx.h264_mv.fd_ion_data.fd; 8780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 8781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev allocation.size = size; 8782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev allocation.align = clip2(alignment); 8783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (allocation.align != 8192) 8784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev allocation.align = 8192; 8785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = open(MEM_DEVICE, O_RDWR); 8787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((int)(pmem_fd) < 0) 8789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) 8792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)", 8794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev allocation.align, allocation.size); 8795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) { 8799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_addr = mmap(NULL, size, 8800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ | PROT_WRITE, 8801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev MAP_SHARED, pmem_fd, 0); 8802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buf_addr == (void*) MAP_FAILED) 8804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(pmem_fd); 8806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 8807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.h264_mv); 8808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = -1; 8810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr); 8811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else 8814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_addr =(unsigned char *) (pmem_fd + 1234); 8815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Allocated virt:%p, FD: %d of size %d count: %d \n", buf_addr, 8816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd, size, drv_ctx.op_buf.actualcount); 8817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv.size = size; 8819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv.count = drv_ctx.op_buf.actualcount; 8820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv.pmem_fd = pmem_fd; 8821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv.offset = 0; 8822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = (void*)&h264_mv; 8824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 8825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_H264_MV_BUFFER, (void*)&ioctl_msg) < 0) 8827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to set the H264_mv_buffers\n"); 8829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.buffer = (unsigned char *) buf_addr; 8833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.size = size; 8834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.count = drv_ctx.op_buf.actualcount; 8835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.offset = 0; 8836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.pmem_fd = pmem_fd; 8837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Saving virt:%p, FD: %d of size %d count: %d \n", h264_mv_buff.buffer, 8838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.pmem_fd, h264_mv_buff.size, drv_ctx.op_buf.actualcount); 8839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 8840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::vdec_dealloc_h264_mv() 8843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(h264_mv_buff.pmem_fd > 0) 8845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_H264_MV_BUFFER,NULL) < 0) 8847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("VDEC_IOCTL_FREE_H264_MV_BUFFER failed"); 8848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) 8849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev munmap(h264_mv_buff.buffer, h264_mv_buff.size); 8850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(h264_mv_buff.pmem_fd); 8851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 8852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.h264_mv); 8853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Cleaning H264_MV buffer of size %d \n",h264_mv_buff.size); 8855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.pmem_fd = -1; 8856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.offset = 0; 8857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.size = 0; 8858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.count = 0; 8859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_mv_buff.buffer = NULL; 8860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 8866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::createDivxDrmContext() 8867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE err = OMX_ErrorNone; 8869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt = DivXDrmDecrypt::Create(); 8870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (iDivXDrmDecrypt) { 8871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE err = iDivXDrmDecrypt->Init(); 8872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(err!=OMX_ErrorNone) { 8873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR :iDivXDrmDecrypt->Init %d", err); 8874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete iDivXDrmDecrypt; 8875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt = NULL; 8876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 8879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM"); 8880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev err = OMX_ErrorUndefined; 8881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return err; 8883e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly} 8884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 8885e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly 888640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgeomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf() 888740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 888840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George enabled = false; 888940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George omx = NULL; 889040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George init_members(); 889140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George ColorFormat = OMX_COLOR_FormatMax; 889240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 889340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 889440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgevoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client) 889540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 889640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George omx = reinterpret_cast<omx_vdec*>(client); 889740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 889840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 889940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgevoid omx_vdec::allocate_color_convert_buf::init_members() { 890040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George allocated_count = 0; 890140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_size_req = 0; 890240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_alignment_req = 0; 890340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George memset(m_platform_list_client,0,sizeof(m_platform_list_client)); 890440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George memset(m_platform_entry_client,0,sizeof(m_platform_entry_client)); 890540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George memset(m_pmem_info_client,0,sizeof(m_pmem_info_client)); 890640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client)); 890740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George memset(op_buf_ion_info,0,sizeof(m_platform_entry_client)); 890840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George for (int i = 0; i < MAX_COUNT;i++) 890940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George pmem_fd[i] = -1; 891040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 891140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 891240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgeomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() { 891340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George c2d.destroy(); 891440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 891540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 891640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::update_buffer_req() 891740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 891840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George bool status = true; 891940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George unsigned int src_size = 0, destination_size = 0; 892040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George OMX_COLOR_FORMATTYPE drv_color_format; 892140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!omx){ 892240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Invalid client in color convert"); 892340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return false; 892440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 892540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!enabled){ 892640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n No color conversion required"); 892740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return status; 892840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 892940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_TILE_4x2 && 893040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George ColorFormat != OMX_COLOR_FormatYUV420Planar) { 893140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion"); 893240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return false; 893340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 893440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George c2d.close(); 893540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George status = c2d.open(omx->drv_ctx.video_resolution.frame_height, 893640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George omx->drv_ctx.video_resolution.frame_width, 893740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George YCbCr420Tile,YCbCr420P); 893840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (status) { 893940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George status = c2d.get_buffer_size(C2D_INPUT,src_size); 894040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (status) 894140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George status = c2d.get_buffer_size(C2D_OUTPUT,destination_size); 894240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 894340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (status) { 894440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size || 894540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George !destination_size) { 894640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d" 894740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George "driver size %d destination size %d", 894840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George src_size,omx->drv_ctx.op_buf.buffer_size,destination_size); 894940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George status = false; 895040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George c2d.close(); 895140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_size_req = 0; 895240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } else { 895340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_size_req = destination_size; 895440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size) 895540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_size_req = omx->drv_ctx.op_buf.buffer_size; 895640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 895740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 895840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 895940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 896040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return status; 896140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 896240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 896340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::set_color_format( 896440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George OMX_COLOR_FORMATTYPE dest_color_format) 896540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 896640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George bool status = true; 896740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George OMX_COLOR_FORMATTYPE drv_color_format; 896840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!omx){ 896940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Invalid client in color convert"); 897040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return false; 897140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 897240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2) 897340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George drv_color_format = (OMX_COLOR_FORMATTYPE) 897440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka; 897540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George else { 897640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Incorrect color format"); 897740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George status = false; 897840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 897940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (status && (drv_color_format != dest_color_format)) { 898040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (dest_color_format != OMX_COLOR_FormatYUV420Planar) { 898140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Unsupported color format for c2d"); 898240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George status = false; 898340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } else { 898457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George DEBUG_PRINT_HIGH("\n Planar color format set"); 898540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George ColorFormat = OMX_COLOR_FormatYUV420Planar; 898640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (enabled) 898740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George c2d.destroy(); 898840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George enabled = false; 898940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!c2d.init()) { 899040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n open failed for c2d"); 899140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George status = false; 899240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } else 899340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George enabled = true; 899440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 899540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } else { 899640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (enabled) 899740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George c2d.destroy(); 899840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George enabled = false; 899940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 900040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return status; 900140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 900240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 900340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr() 900440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 900540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!omx){ 900640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr"); 900740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return NULL; 900840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 900940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!enabled) 901040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return omx->m_out_mem_ptr; 901140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return m_out_mem_ptr_client; 901240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 901340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 901440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr 901540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George (OMX_BUFFERHEADERTYPE *bufadd) 901640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 901740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!omx){ 901840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr"); 901940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return NULL; 902040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 902140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!enabled) 902240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return bufadd; 902340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George unsigned index = 0; 902440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George index = bufadd - omx->m_out_mem_ptr; 902540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (index < omx->drv_ctx.op_buf.actualcount) { 902640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS); 902740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp; 902840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George bool status; 902940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!omx->in_reconfig && !omx->output_flush_progress) { 903040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd, 903140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George bufadd->pBuffer,pmem_fd[index],pmem_baseaddress[index]); 903240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[index].nFilledLen = buffer_size_req; 903340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!status){ 903440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Failed color conversion %d", status); 903540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return NULL; 903640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 903740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } else 903840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[index].nFilledLen = 0; 903940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return &m_out_mem_ptr_client[index]; 904040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 904140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr"); 904240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return NULL; 904340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 904440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 904540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr 904640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George (OMX_BUFFERHEADERTYPE *bufadd) 904740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 904840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!omx){ 904940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr"); 905040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return NULL; 905140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 905240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!enabled) 905340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return bufadd; 905440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George unsigned index = 0; 905540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George index = bufadd - m_out_mem_ptr_client; 905640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (index < omx->drv_ctx.op_buf.actualcount) { 905740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return &omx->m_out_mem_ptr[index]; 905840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 905940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr"); 906040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return NULL; 906140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 906240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::get_buffer_req 906340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George (unsigned int &buffer_size) 906440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 906540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!enabled) 906640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_size = omx->drv_ctx.op_buf.buffer_size; 906740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George else 906840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) { 906940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Get buffer size failed"); 907040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return false; 907140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 907240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (buffer_size < omx->drv_ctx.op_buf.buffer_size) 907340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_size = omx->drv_ctx.op_buf.buffer_size; 907440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 907540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 907640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return true; 907740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 907840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer( 907940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George OMX_BUFFERHEADERTYPE *bufhdr) { 908040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George unsigned int index = 0; 908140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 908240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!enabled) 908340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return omx->free_output_buffer(bufhdr); 908440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (enabled && omx->is_component_secure()) 908540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorNone; 908640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!allocated_count || !bufhdr) { 908740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr); 908840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorBadParameter; 908940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 909040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George index = bufhdr - m_out_mem_ptr_client; 909140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (index >= omx->drv_ctx.op_buf.actualcount){ 909240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer"); 909340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorBadParameter; 909440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 909540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (pmem_fd[index] > 0) { 909640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George munmap(pmem_baseaddress[index], buffer_size_req); 909740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George close(pmem_fd[index]); 909840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 909940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George pmem_fd[index] = -1; 910040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George omx->free_ion_memory(&op_buf_ion_info[index]); 910140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_heap_ptr[index].video_heap_ptr = NULL; 910240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (allocated_count > 0) 910340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George allocated_count--; 910440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George else 910540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George allocated_count = 0; 910640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!allocated_count) { 910740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George c2d.close(); 910840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George init_members(); 910940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 911040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return omx->free_output_buffer(&omx->m_out_mem_ptr[index]); 911140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 911240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 911340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 911440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes) 911540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 911640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George OMX_ERRORTYPE eRet = OMX_ErrorNone; 911740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!enabled){ 911840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 911940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return eRet; 912040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 912140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (enabled && omx->is_component_secure()) { 912240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d", 912340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George omx->is_component_secure()); 912440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorUnsupportedSetting; 912540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 912640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!bufferHdr || bytes > buffer_size_req) { 912740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr); 912840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %d", 912940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_size_req,bytes); 913040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorBadParameter; 913140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 913240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (allocated_count >= omx->drv_ctx.op_buf.actualcount) { 913340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert"); 913440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorInsufficientResources; 913540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 913640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL; 913740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr, 913840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George port,appData,omx->drv_ctx.op_buf.buffer_size); 913940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (eRet != OMX_ErrorNone || !temp_bufferHdr){ 914040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert"); 914140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return eRet; 914240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 914340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if ((temp_bufferHdr - omx->m_out_mem_ptr) >= 914440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George omx->drv_ctx.op_buf.actualcount) { 914540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n Invalid header index %d", 914640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George (temp_bufferHdr - omx->m_out_mem_ptr)); 914740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorUndefined; 914840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 914940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George unsigned int i = allocated_count; 915040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory( 915140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George buffer_size_req,buffer_alignment_req, 915240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,CACHED); 915340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 915440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd; 915540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (op_buf_ion_info[i].ion_device_fd < 0) { 915640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert"); 915740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorInsufficientResources; 915840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 915940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req, 916040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0); 916140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 916240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (pmem_baseaddress[i] == MAP_FAILED) { 916340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req); 916440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George close(pmem_fd[i]); 916540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George omx->free_ion_memory(&op_buf_ion_info[i]); 916640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return OMX_ErrorInsufficientResources; 916740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 916840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_heap_ptr[i].video_heap_ptr = new VideoHeap ( 916940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George op_buf_ion_info[i].ion_device_fd,buffer_size_req, 917040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]); 917140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get(); 917240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_pmem_info_client[i].offset = 0; 917340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i]; 917440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 917540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_platform_list_client[i].nEntries = 1; 917640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_platform_list_client[i].entryList = &m_platform_entry_client[i]; 917740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[i].pOutputPortPrivate = NULL; 917840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[i].nAllocLen = buffer_size_req; 917940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[i].nFilledLen = 0; 918040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[i].nFlags = 0; 918140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 918240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE); 918340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION; 918440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i]; 918540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i]; 918640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George m_out_mem_ptr_client[i].pAppPrivate = appData; 918740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George *bufferHdr = &m_out_mem_ptr_client[i]; 918840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr); 918940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George allocated_count++; 919040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return eRet; 919140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 919240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 919340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::is_component_secure() 919440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 919540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return secure_mode; 919640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 919740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George 919840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew Georgebool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format) 919940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George{ 920040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George bool status = true; 920140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (!enabled) { 920240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2) 920340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George dest_color_format = (OMX_COLOR_FORMATTYPE) 920440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka; 920540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 920640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George dest_color_format = OMX_COLOR_FormatYUV420SemiPlanar; 920740f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George else 920840f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George status = false; 920940f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } else { 921040f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George if (ColorFormat != OMX_COLOR_FormatYUV420Planar) { 921140f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George status = false; 921240f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } else 921340f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George dest_color_format = OMX_COLOR_FormatYUV420Planar; 921440f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George } 921540f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George return status; 921640f34d83af63a67dfa16c98767e582c4a2b2fdecHaynes Mathew George} 9217fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 9218fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgeint omx_vdec::secureDisplay(int mode) { 9219fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (m_secure_display == true) { 9220fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George return 0; 9221fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 9222fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 9223fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George sp<IServiceManager> sm = defaultServiceManager(); 9224fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George sp<qService::IQService> displayBinder = 9225fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George interface_cast<qService::IQService>(sm->getService(String16("display.qservice"))); 9226fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 9227fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (displayBinder != NULL) { 9228fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George displayBinder->securing(mode); 9229fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (mode == qService::IQService::END) { 9230fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George m_secure_display = true; 9231fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 9232fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 9233fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George else { 9234fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George DEBUG_PRINT_ERROR("secureDisplay(%d) display.qservice unavailable", mode); 9235fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 9236fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George return 0; 9237fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George} 9238fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 9239fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew Georgeint omx_vdec::unsecureDisplay(int mode) { 9240fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (m_secure_display == false) { 9241fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George return 0; 9242fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 9243fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 9244fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (mode == qService::IQService::END) { 9245fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George m_secure_display = false; 9246fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George } 9247fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 9248fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George sp<IServiceManager> sm = defaultServiceManager(); 9249fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George sp<qService::IQService> displayBinder = 9250fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George interface_cast<qService::IQService>(sm->getService(String16("display.qservice"))); 9251fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George 9252fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George if (displayBinder != NULL) 9253fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George displayBinder->unsecuring(mode); 9254fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George else 9255fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George DEBUG_PRINT_ERROR("unsecureDisplay(%d) display.qservice unavailable", mode); 9256fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George return 0; 9257fcb1a02a7e154802e883bfdfde972e603f8a0a7cHaynes Mathew George} 925857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George 925957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew GeorgeOMX_ERRORTYPE omx_vdec::update_color_format(OMX_COLOR_FORMATTYPE eColorFormat) 926057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George{ 926157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 926257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George OMX_ERRORTYPE eRet = OMX_ErrorNone; 926357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George enum vdec_output_fromat op_format; 926457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George if(eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) 926557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George op_format = VDEC_YUV_FORMAT_NV12; 926657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George else if(eColorFormat == 926757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka || 926857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George eColorFormat == OMX_COLOR_FormatYUV420Planar) 926957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George op_format = VDEC_YUV_FORMAT_TILE_4x2; 927057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George else 927157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George eRet = OMX_ErrorBadParameter; 927257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George 927357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George if(eRet == OMX_ErrorNone && drv_ctx.output_format != op_format) { 927457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George /*Set the output format*/ 927557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George drv_ctx.output_format = op_format; 927657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George ioctl_msg.in = &drv_ctx.output_format; 927757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George ioctl_msg.out = NULL; 927857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_OUTPUT_FORMAT, 927957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George (void*)&ioctl_msg) < 0) { 928057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George DEBUG_PRINT_ERROR("\n Set output format failed for %u with err %s", 928157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George eColorFormat, strerror(errno)); 928257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George eRet = OMX_ErrorUnsupportedSetting; 928357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George } 928457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George else 928557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George eRet = get_buffer_req(&drv_ctx.op_buf); 928657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George } 928757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George if (eRet == OMX_ErrorNone){ 928857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George if (!client_buffers.set_color_format(eColorFormat)) { 928957550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George DEBUG_PRINT_ERROR("\n Set color format failed for %u", eColorFormat); 929057550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George eRet = OMX_ErrorBadParameter; 929157550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George } 929257550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George } 929357550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George if (!client_buffers.update_buffer_req()) { 929457550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George DEBUG_PRINT_ERROR("\n Update bufreq in color format failed for %u", eColorFormat); 929557550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George eRet = OMX_ErrorBadParameter; 929657550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George } 929757550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George return eRet; 929857550cf78d0e21406efd278ad44069674b2e1813Haynes Mathew George} 9299