1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*-------------------------------------------------------------------------- 28767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanCopyright (c) 2013-2014, The Linux Foundation. All rights reserved. 3826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRedistribution and use in source and binary forms, with or without 5826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevmodification, are permitted provided that the following conditions are met: 6826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * Redistributions of source code must retain the above copyright 7826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev notice, this list of conditions and the following disclaimer. 8826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * Redistributions in binary form must reproduce the above copyright 9826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev notice, this list of conditions and the following disclaimer in the 10826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev documentation and/or other materials provided with the distribution. 116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal * Neither the name of The Linux Foundation nor 12826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev the names of its contributors may be used to endorse or promote 13826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev products derived from this software without specific prior written 14826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev permission. 15826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 16826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 20826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev--------------------------------------------------------------------------*/ 28826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 29826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*============================================================================ 30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev O p e n M A X w r a p p e r s 31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev O p e n M A X C o r e 32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 33826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//** @file omx_vdec.cpp 34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev This module contains the implementation of the OpenMAX core & component. 35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//*========================================================================*/ 37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev////////////////////////////////////////////////////////////////////////////// 39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Include Files 40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev////////////////////////////////////////////////////////////////////////////// 41826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 42826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <string.h> 43826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <pthread.h> 44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h> 45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <stdlib.h> 46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <unistd.h> 47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <errno.h> 486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include "omx_vdec_hevc.h" 49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <fcntl.h> 50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <limits.h> 516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <media/msm_media_info.h> 526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <qdMetaData.h> 53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_ 55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h> 56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/mman.h> 57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <cutils/properties.h> 61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef USE_EGL_IMAGE_GPU 62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <gralloc_priv.h> 66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "DivXDrmDecrypt.h" 70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h> 74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h> 75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00 76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01 77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0" 81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30 82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1; 83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0"; 84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1; 87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv"; 88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile; 91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata"; 92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef VENUS_HEVC 958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEVICE_NAME "/dev/video/venus_dec" 968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else 978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEVICE_NAME "/dev/video/q6_dec" 988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif 998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30 101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR DEFAULT_FPS 102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120 103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE 0xC5000000 105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK 0xFF000000 106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE 0x0F010000 107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK 0xF0 108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK 0xE0000000 109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE 0 110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE 1 111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE 3 112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL 0 113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL 2 114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN 4 115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS 8 116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS 12 117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS 24 118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE 36 1196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define POLL_TIMEOUT 0x7fffffff 120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion" 122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_HEAP_ID ION_CP_MM_HEAP_ID 123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 12561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" { 12661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include<utils/Log.h> 12761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_ 129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_4K 0x1000 1316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_1M 0x100000 1326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } } 134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); } 1356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define EXTRADATA_IDX(__num_planes) (__num_planes - 1) 136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA) 1388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 1398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint debug_level = PRIO_ERROR; 1408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input) 142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer; 14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct pollfd pfd; 14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer v4l2_buf; 14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event dqevent; 14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec *omx = reinterpret_cast<omx_vdec*>(input); 15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pfd.fd = omx->drv_ctx.video_driver_fd; 15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0; 1538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: Async thread start"); 15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0); 15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = poll(&pfd, 1, POLL_TIMEOUT); 15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!rc) { 1588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Poll timedout"); 15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (rc < 0) { 1618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error while polling: %d", rc); 16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) { 16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.memory = V4L2_MEMORY_USERPTR; 16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.length = omx->drv_ctx.num_planes; 16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.m.planes = plane; 17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) { 17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.len=plane[0].bytesused; 17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr; 17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) + 17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (uint64_t)v4l2_buf.timestamp.tv_usec; 17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (vdec_msg.msgdata.output_frame.len) { 17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2]; 18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3]; 18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4]; 18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5]; 18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 1858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) { 19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.memory = V4L2_MEMORY_USERPTR; 19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.length = 1; 19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.m.planes = plane; 19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) { 19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE; 19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pfd.revents & POLLPRI) { 20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent); 20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) { 20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED; 21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved"); 21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 21761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT ) { 21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_INFO_CONFIG_CHANGED; 22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved"); 22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) { 22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 22861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE; 22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Flush Done Recieved"); 23161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 23361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 23561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE; 23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Flush Done Recieved"); 23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 24161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) { 2438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Close Done Recieved and async_message_thread Exited"); 24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) { 24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 24761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR; 24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("SYS Error Recieved"); 25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 25361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 2558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Some Event recieved"); 25661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan continue; 25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: Async thread stop"); 26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input) 265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec* omx = reinterpret_cast<omx_vdec*>(input); 26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char id; 26861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int n; 26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx == NULL) { 2708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("message thread null pointer rxd"); 27161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 27261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: message thread start"); 27561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0); 27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan n = read(omx->m_pipe_in, &id, 1); 279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == n) { 28161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 28261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (1 == n) { 28561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->process_event_cb(omx, id); 28661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((n < 0) && (errno != EINTR)) { 2888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno); 28961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 29061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: message thread stop"); 29361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id) 297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 29861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret_value; 2996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 30061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx == NULL) { 3018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("message thread null pointer rxd"); 30261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 30361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out); 30561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret_value = write(omx->m_pipe_out, &id, 1); 3068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value); 307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor 310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue() 311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 31261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Nothing to do 313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor 316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memset(m_q,0,sizeof(m_q)); 319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert 322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id) 323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) { 32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].id = id; 32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].param1 = p1; 32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].param2 = p2; 32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_write++; 33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_size ++; 33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) { 33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_write = 0; 33361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 3368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__); 33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop 342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id) 343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_size > 0) { 34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *id = m_q[m_read].id; 34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *p1 = m_q[m_read].param1; 34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *p2 = m_q[m_read].param2; 34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the read pointer ahead 35061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ++m_read; 35161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan --m_size; 35261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) { 35361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_read = 0; 35461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 35561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 35661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 35761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 35861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue 362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type() 363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return m_q[m_read].id; 365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list() 369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 37061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //initialize timestamps array 37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) ); 372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list() 374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //free m_ts_arr_list? 376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts) 379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool duplicate_ts = false; 38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //insert at the first available empty location 38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_ts_arr_list[idx].valid) { 38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //found invalid or empty entry, save timestamp 38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].valid = true; 38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].timestamp = ts; 39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts, idx); 39261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) { 39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 39961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 40061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int min_idx = -1; 40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_TICKS min_ts = 0; 40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_ts_arr_list[idx].valid) { 41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //found valid entry, save index 41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (min_idx < 0) { 41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //first valid entry 41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_ts = m_ts_arr_list[idx].timestamp; 41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_idx = idx; 41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_ts_arr_list[idx].timestamp < min_ts) { 41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_ts = m_ts_arr_list[idx].timestamp; 42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_idx = idx; 42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (min_idx < 0) { 42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //no valid entries found 42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts = 0; 43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts = m_ts_arr_list[min_idx].timestamp; 43361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[min_idx].valid = false; 43461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 43561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts, min_idx); 43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 43761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list() 444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 44761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 44961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].valid = false; 45161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 45261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances 457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void) 458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 45961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return (new omx_vdec); 460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base, 46561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_handle *handle, int ionMapfd) 466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 46761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd); 468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base) 471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // dup file descriptor, map once, use pmem 473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev init(dup(fd), base, size, 0 , MEM_DEVICE); 474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_ 477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::omx_vdec 480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Constructor 483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None 486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::omx_vdec(): m_error_propogated(false), 49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state(OMX_StateInvalid), 49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_app_data(NULL), 49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr(NULL), 49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr(NULL), 49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_err_count(0), 49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress (false), 49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress (false), 49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_use_buffer (false), 49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_use_buffer (false), 50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers(false), 50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem(OMX_FALSE), 50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_region_smi(OMX_FALSE), 50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_pvt_entry_pmem(OMX_FALSE), 50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers(0), 50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers(0), 50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count(0), 50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bm_count(0), 50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated(OMX_FALSE), 50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bPopulated(OMX_FALSE), 51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_flags(0), 511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr(NULL), 513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled(OMX_TRUE), 51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled(OMX_TRUE), 51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_in_alloc_cnt(0), 51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list(NULL), 51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry(NULL), 51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info(NULL), 52061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes (true), 52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame (NULL), 52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame (NULL), 52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr (NULL), 52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr(NULL), 52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_inp_bm_count (0), 52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse ((codec_type)0), 52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame_meta (true), 52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count (0), 52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count (0), 53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length(0), 53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal (false), 53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame(0), 53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_buffer(NULL), 53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame_size (0), 53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_device_file_ptr(NULL), 53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile((vc1_profile_type)0), 53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts(LLONG_MAX), 53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags(0), 53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts(LLONG_MAX), 54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts(true), 54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int(0), 54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan in_reconfig(false), 54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_display_id(NULL), 54461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser(NULL), 54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata(0), 546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_enable_android_native_buffers(OMX_FALSE), 54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_android_native_buffers(OMX_FALSE), 54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan iDivXDrmDecrypt(NULL), 550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 55161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr(NULL), 55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan secure_mode(false) 553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 55461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Assumption is that , to begin with , we have all the frames with decoder */ 55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("In OMX vdec Constructor"); 556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 55761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char property_value[PROPERTY_VALUE_MAX] = {0}; 5588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_get("vidc.debug.level", property_value, "1"); 5598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan debug_level = atoi(property_value); 5608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_value[0] = '\0'; 5618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.perf", property_value, "0"); 56361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan perf_flag = atoi(property_value); 56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag); 56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms = latency = 0; 56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.ts", property_value, "0"); 57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_timestamp = atoi(property_value); 57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp); 57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(true); 57561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.enable_debug_print(true); 57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 57861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.concealedmb", property_value, "0"); 58061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_concealedmb = atoi(property_value); 58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb); 582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_cmp,0,sizeof(m_cmp)); 58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_cb,0,sizeof(m_cb)); 58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (&drv_ctx,0,sizeof(drv_ctx)); 58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE)); 58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (m_hwdevice_name,0,sizeof(m_hwdevice_name)); 58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, sizeof(m_demux_offsets) ); 59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 5916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_ 59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 5936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.timestamp_adjust = false; 59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = -1; 59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = NULL; 59861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init(&m_lock, NULL); 59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init(&c_lock, NULL); 60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_init(&m_cmd_lock,0,0); 60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = 60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[OUTPUT_PORT] = false; 603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char extradata_value[PROPERTY_VALUE_MAX] = {0}; 60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.extradata", extradata_value, "0"); 60661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_extradata = atoi(extradata_value); 60761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata); 608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB; 61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_buffers.set_vdec_client(this); 6116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 6126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 6136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = { 61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_FLUSH_DONE, 61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT, 61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT, 61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_CLOSE_DONE, 61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_SYS_ERROR 6196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}; 6206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 6216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd) 6226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event_subscription sub; 62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int array_sz = sizeof(event_type)/sizeof(int); 62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i,rc; 62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 6288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid input: %d", fd); 62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < array_sz; ++i) { 63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 6378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type); 63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 64061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < array_sz) { 64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (--i; i >=0 ; i--) { 64361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 64561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 64661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) 6478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 64961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNotImplemented; 65061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 65161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd) 6566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event_subscription sub; 65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int array_sz = sizeof(event_type)/sizeof(int); 66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i,rc; 66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 6628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid input: %d", fd); 66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 66461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 66561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < array_sz; ++i) { 66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 66861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 66961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 6718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 67461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 6766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 6776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 67961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::~omx_vdec 681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Destructor 684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None 687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec() 692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = NULL; 69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_decoder_cmd dec; 69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("In OMX vdec Destructor"); 69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_pipe_in) close(m_pipe_in); 69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_pipe_out) close(m_pipe_out); 69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_in = -1; 69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_out = -1; 70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_join(msg_thread_id,NULL); 70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.cmd = V4L2_DEC_CMD_STOP; 70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 7058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("STOP Command failed"); 70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_join(async_thread_id,NULL); 70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsubscribe_to_events(drv_ctx.video_driver_fd); 70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&m_lock); 71161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&c_lock); 71261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_destroy(&m_cmd_lock); 71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME"); 71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.end(); 71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Exit OMX vdec Destructor"); 718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type) 72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = 0; 72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 72961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 7316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 7326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 73461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::OMXCntrlProcessMsgCb 736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL Client callbacks are generated through this routine. The decoder 73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan provides the thread context for this routine. 740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ctxt -- Context information related to the self. 74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id -- Event identifier. This could be any of the following: 74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1. Command completion event 74561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2. Buffer done callback event 74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3. Frame done callback event 747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id) 753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan signed int p1; // Parameter - 1 75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan signed int p2; // Parameter - 2 75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int ident; 75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int qsize=0; // qsize 75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec *pThis = (omx_vdec *) ctxt; 75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis) { 7618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out", 76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan __func__); 76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Protect the shared queue data structure 76761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan do { 76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Read the message id's from the queue*/ 76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&pThis->m_lock); 77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_cmd_q.m_size; 77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 77261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize == 0 && pThis->m_state != OMX_StatePause) { 77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_ftb_q.m_size; 77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize == 0 && pThis->m_state != OMX_StatePause) { 78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_etb_q.m_size; 78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&pThis->m_lock); 78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*process message if we have one*/ 79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize > 0) { 79261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id = ident; 79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (id) { 79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT: 79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (p1) { 79761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandStateSet: 79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = (OMX_STATETYPE) p2; 7998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d", 80061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state); 80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL); 80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_EventError: 80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_StateInvalid) { 8078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid"); 80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = (OMX_STATETYPE) p2; 80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (p2 == OMX_ErrorHardware) { 81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error(); 81361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventError, p2, (OMX_U32)NULL, NULL ); 81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 81861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandPortDisable: 8208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%d]", p2); 82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) { 82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT)) 8308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to release output buffers"); 83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf); 83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->in_reconfig = false; 83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error(); 83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandPortEnable: 8438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%d]", p2); 84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 8558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_ETB_ARBITRARY: 85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 8618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure"); 86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_ETB: 86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 8688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure"); 86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FTB: 87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 8768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure"); 87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_COMMAND: 88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U32)p2,(OMX_PTR)NULL); 88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EBD: 88761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) { 8898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure"); 89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) { 89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_inp_err_count++; 89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->time_stamp_dts.remove_time_stamp( 89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp, 89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_inp_err_count = 0; 90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( pThis->empty_buffer_done(&pThis->m_cmp, 90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 9038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_buffer_done failure"); 90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) { 9078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR); 90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: 91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int64_t *timestamp = (int64_t *)p1; 91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p1) { 91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->time_stamp_dts.remove_time_stamp(*timestamp, 91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(timestamp); 92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FBD: 92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 9258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure"); 92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 92761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( pThis->fill_buffer_done(&pThis->m_cmp, 92861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 9298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("fill_buffer_done failure"); 93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 9358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Driver flush i/p Port complete"); 93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->input_flush_progress) { 9378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->execute_input_flush(); 94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 9428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we need generate event for Flush done*/ 94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_INPUT_FLUSH_PENDING)) { 94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 9498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Input Flush completed - Notify Client"); 95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandFlush, 95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX,NULL ); 95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_IDLE_PENDING)) { 95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) { 9578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port"); 95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->streaming[OUTPUT_PORT] = false; 96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->output_flush_progress) { 9638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Input flush done hence issue stop"); 96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 9768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Driver flush o/p Port complete"); 97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->output_flush_progress) { 9788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->execute_output_flush(); 98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 9838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we need generate event for Flush done*/ 98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) { 9898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Notify Output Flush done"); 99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandFlush, 99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 9978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Internal flush complete"); 99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) { 100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event(OMX_CommandPortDisable, 100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 100661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) { 101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 10138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port"); 101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->streaming[CAPTURE_PORT] = false; 101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->input_flush_progress) { 10198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Output flush done hence issue stop"); 102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 103061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_START_DONE: 10328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE"); 103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 10368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure"); 103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 10398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success"); 104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 10418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Move to executing"); 104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateExecuting; 104561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateExecuting, NULL); 104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (BITMASK_PRESENT(&pThis->m_flags, 104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_PAUSE_PENDING)) { 105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (/*ioctl (pThis->drv_ctx.video_driver_fd, 105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) { 10528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed"); 105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 10588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Event Handler callback is NULL"); 105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_PAUSE_DONE: 10638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->complete_pending_buffer_done_cbs(); 107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) { 10718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Send the callback now 107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StatePause; 107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StatePause, NULL); 107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_RESUME_DONE: 10878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 10908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 10948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Moving the decoder to execute state"); 109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateExecuting; 109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateExecuting,NULL); 110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_STOP_DONE: 11108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 11138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->complete_pending_buffer_done_cbs(); 111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) { 11188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success"); 111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateIdle; 11228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Move to Idle State"); 112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateIdle,NULL); 112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 11358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG"); 113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_IndexParamPortDefinition) { 113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->in_reconfig = true; 113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventPortSettingsChanged, p1, p2, NULL ); 114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) { 114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1; 114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged; 115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan format = OMX_InterlaceInterleaveFrameTopFieldFirst; 115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan format = OMX_InterlaceInterleaveFrameBottomFieldFirst; 115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else //unsupported interlace format; raise a error 115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan event = OMX_EventError; 115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan event, format, 0, NULL ); 115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 116461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EOS_DONE: 11668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->prev_ts = LLONG_MAX; 117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->rst_prev_ts = true; 117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 117661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 11788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 118161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG: 118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 11838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG"); 118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL ); 118761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 119061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 119261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 119561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&pThis->m_lock); 119661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_cmd_q.m_size; 119761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_state != OMX_StatePause) 119861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 119961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&pThis->m_lock); 120061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } while (qsize>0); 1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 12046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::update_resolution(int width, int height) 12056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 12066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.frame_height = height; 12076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.frame_width = width; 12086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.scan_lines = height; 12096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.stride = width; 12106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nLeft = 0; 12116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nTop = 0; 12126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nWidth = drv_ctx.video_resolution.frame_width; 12136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nHeight = drv_ctx.video_resolution.frame_height; 12146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentInit 1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Initialize the component. 1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ctxt -- Context information related to the self. 122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id -- Event identifier. This could be any of the following: 122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1. Command completion event 122761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2. Buffer done callback event 122861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3. Frame done callback event 1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 123361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) 1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_fmtdesc fdesc; 123961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 124061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int alignment = 0,buffer_size = 0; 124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fds[2]; 124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int r,ret=0; 124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool codec_ambiguous = false; 12468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_STRING device_name = (OMX_STRING)DEVICE_NAME; 12478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Opening device %s", device_name); 124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = open(device_name, O_RDWR); 124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 12508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec::component_init(): Open device %s returned fd %d, errno %d", 125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan device_name, drv_ctx.video_driver_fd, errno); 125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_driver_fd == 0) { 125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = open(device_name, O_RDWR); 125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 125661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 125761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_driver_fd < 0) { 12588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno); 125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 126061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 126161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 12646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal ret = pthread_create(&async_thread_id,0,async_message_thread,this); 126561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret < 0) { 126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 12678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to create async_message_thread"); 126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 127261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcpy(inputfilename, INPUT_BUFFER_FILE_NAME); 1273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputBufferFile1 = fopen (outputfilename, "ab"); 1276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputExtradataFile = fopen (ouputextradatafilename, "ab"); 1279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Copy the role information which provides the decoder kind 128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy(drv_ctx.kind,role,128); 128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\ 128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mpeg4",\ 128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.timestamp_adjust = true; 128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4; 129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingMPEG4; 129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_MPEG4; 129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Start Code for MPEG4*/ 129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_MPEG4; 129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "m4v"); 1297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\ 129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mpeg2",\ 130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2; 130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_MPEG2; 130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingMPEG2; 130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Start Code for MPEG2*/ 130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_MPEG2; 130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "mpg"); 1310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\ 131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 13148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("H263 Decoder selected"); 131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_H263; 131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingH263; 131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_H263; 131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_H263; 131961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "263"); 1322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\ 132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 13268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW ("DIVX 311 Decoder selected"); 132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3; 132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX_311; 132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = createDivxDrmContext(); 133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ 133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 13418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected"); 134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4; 134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX; 134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_ambiguous = true; 134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = createDivxDrmContext(); 135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\ 135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 13578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected"); 135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6; 135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX; 136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_ambiguous = true; 136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = createDivxDrmContext(); 136661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\ 137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_H264; 137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_H264; 137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingAVC; 137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_H264; 137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "264"); 1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\ 138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC; 138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_HEVC; 138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc; 138961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_HEVC; 139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 13926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef INPUT_BUFFER_LOG 139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "265"); 13946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\ 139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 139861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_VC1; 139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingWMV; 140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VC1; 140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_VC1_ANNEX_G; 140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "vc1"); 1405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\ 140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV; 141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingWMV; 141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VC1; 141261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_VC1_ANNEX_L; 141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "vc1"); 1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",\ 141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_VP8; 14215aa03230fef7a43a61e1ac5f19a2c5a71e5d6df7Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingVP8; 142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VP8; 142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 14258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Unknown Component"); 142661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan inputBufferFile1 = fopen (inputfilename, "ab"); 1430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 1432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 143361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.output_format = VDEC_YUV_FORMAT_NV12; 14346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE) 14356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 14366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (!client_buffers.set_color_format(dest_color_format)) { 14378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setting color format failed"); 14386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet = OMX_ErrorInsufficientResources; 14396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 1440dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan capture_capability= V4L2_PIX_FMT_NV12; 144261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = subscribe_to_events(drv_ctx.video_driver_fd); 144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 14448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Subscribe Event Failed"); 144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 144761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_capability cap; 144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap); 145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 14518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to query capabilities"); 145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s," 14558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " version = %d, capabilities = %x", cap.driver, cap.card, 145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan cap.bus_info, cap.version, cap.capabilities); 145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=0; 145961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 146061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index=0; 146161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 14628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.pixelformat, fdesc.flags); 146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index++; 146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index=0; 146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 14708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.pixelformat, fdesc.flags); 147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index++; 147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal update_resolution(320, 240); 147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 148061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 14828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set format on output port"); 148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set Format was successful"); 148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_ambiguous) { 148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (output_capability == V4L2_PIX_FMT_DIVX) { 148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control divx_ctrl; 148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) { 149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4; 149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) { 149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5; 149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6; 149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT; 149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl); 149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 15008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set divx version"); 150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Codec should not be ambiguous"); 150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 15148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set format on capture port"); 151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 15168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set Format was successful"); 151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE; 151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = 1; 15208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret); 152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 15238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret); 152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 152961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Get the Buffer requirements for input and output ports*/ 153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT; 153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment=SZ_1M; 153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment=SZ_1M; 153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 153661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment=SZ_4K; 153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment=SZ_4K; 153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata = 0; 154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.picture_order = VDEC_ORDER_DISPLAY; 154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.idr_only_decoding = 0; 1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 15476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_state = OMX_StateLoaded; 1548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA 15496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (eRet == OMX_ErrorNone && !secure_mode) 15506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal enable_extradata(DEFAULT_EXTRADATA, true, true); 1551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 15526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet=get_buffer_req(&drv_ctx.ip_buf); 15538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Input Buffer Size =%d",drv_ctx.ip_buf.buffer_size); 15546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal get_buffer_req(&drv_ctx.op_buf); 155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 || 155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC) { 155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size; 155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size); 155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nOffset = 0; 156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 15638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed "); 156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils == NULL) { 157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils = new H264_Utils(); 157161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 157261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils == NULL) { 15738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("parser utils Allocation failed "); 157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size); 157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser = new h264_stream_parser(); 158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!h264_parser) { 158361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!"); 158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 158561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 158761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pipe(fds)) { 15898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("pipe creation failed"); 159061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 159261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int temp1[2]; 159361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fds[0] == 0 || fds[1] == 0) { 159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pipe (temp1)) { 15958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("pipe creation failed"); 159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 15976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //close (fds[0]); 159961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //close (fds[1]); 160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fds[0] = temp1 [0]; 160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fds[1] = temp1 [1]; 160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_in = fds[0]; 160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_out = fds[1]; 160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan r = pthread_create(&msg_thread_id,0,message_thread,this); 160661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (r < 0) { 16088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("component_init(): message_thread creation failed"); 160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 161161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 161261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 16136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 161461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 16158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Component Init Failed"); 16168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Calling VDEC_IOCTL_STOP_NEXT_MSG"); 161761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 161861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL); 16198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Calling close() on Video Driver"); 162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.video_driver_fd); 162161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = -1; 162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 16238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec::component_init() success"); 162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 162561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer)); 162661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 163061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 163161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetComponentVersion 1632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns the component version. 1635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 163761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan TBD. 1638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 163961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 164061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorNone. 1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 164261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_component_version 164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan( 164561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STRING componentName, 164761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* componentVersion, 164861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* specVersion, 164961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_UUIDTYPE* componentUUID 165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 165261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 16538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Comp Version in Invalid State"); 1654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 1655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* TBD -- Return the proper version */ 165761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (specVersion) { 165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan specVersion->nVersion = OMX_SPEC_VERSION; 165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 166061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 1661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 166361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 166461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommand 1665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 166661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 1668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 166961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 167061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 167261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 167361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 167561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp, 167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_COMMANDTYPE cmd, 167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 param1, 167961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR cmdData 168061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 16828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command: Recieved a Command from Client"); 168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 16848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State"); 1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 1686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) { 16898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush " 169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "to invalid port: %lu", param1); 169161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 1694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_wait(&m_cmd_lock); 16958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command: Command Processed"); 1696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommand 1702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 170461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 1705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 1711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_COMMANDTYPE cmd, 171561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 param1, 171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR cmdData 171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STATETYPE eState = (OMX_STATETYPE) param1; 172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bFlag = 1,sem_posted = 0,ret=0; 172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd); 17248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d", 172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state, eState); 172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (cmd == OMX_CommandStateSet) { 17288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued"); 17298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState); 173061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Loaded */ 173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateLoaded) { 173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateIdle) { 173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //if all buffers are allocated or all ports disabled 173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done() || 173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) { 17388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle"); 173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 17408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending"); 174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 174561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Loaded */ 174761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 17488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded"); 174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 175261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to WaitForResources */ 175461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 17578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources"); 175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 175961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Executing */ 176061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 17618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing"); 176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Pause */ 176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 17688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause"); 176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 177261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Invalid */ 177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 17758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid"); 177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 17798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\ 178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eState); 178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 178461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 178561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is IDLE */ 178761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateIdle) { 178961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateLoaded) { 179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_done()) { 179161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* 179261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Since error is None , we will post an event at the end 179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan of this function definition 179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 17958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded"); 179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 17978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending"); 179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 180361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Executing */ 180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 18058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 180661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 180761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 18088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state=OMX_StateExecuting; 18108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful"); 181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Idle */ 181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateIdle) { 18148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle"); 181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 181761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 181961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to WaitForResources */ 182061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 18218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources"); 182261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 182361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 182561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 182661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Pause */ 182761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 182861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*To pause the Video core we need to start the driver*/ 182961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START, 183061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL) < */0) { 18318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED"); 183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorHardware; 183461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 183561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 18368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause"); 183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 184061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Invalid */ 184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 18428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid"); 184361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 184461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 184561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 18468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState); 184761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 184861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1849dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand } 1850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /******************************/ 185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Executing */ 185361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /******************************/ 185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateExecuting) { 18558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting"); 185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Idle */ 185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateIdle) { 185861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 185961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition 186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 18618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle"); 186261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 186361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 186461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_ALL); 186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 186961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 187061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Paused */ 187161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 18728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PAUSE Command Issued"); 187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StatePause; 187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 187561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 187661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Loaded */ 187761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 18788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded"); 187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 188061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 188361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to WaitForResources */ 188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 18858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources"); 188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 189061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Executing */ 189161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 18928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing"); 189361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 189461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 189761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Invalid */ 189861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 18998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid"); 190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 190161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 19038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState); 190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 190861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Pause */ 190961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StatePause) { 191161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Executing */ 191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateExecuting) { 19138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pause --> Executing"); 191461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StateExecuting; 191561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 191661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Idle */ 191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateIdle) { 191961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 19218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pause --> Idle"); 192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 192361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_ALL); 192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 193061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to loaded */ 193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 19328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> loaded"); 193361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 193461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 193761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to WaitForResources */ 193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 19398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> WaitForResources"); 194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 194461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Pause */ 194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 19468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> Pause"); 194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 194961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 195061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 195161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Invalid */ 195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 19538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> Invalid"); 195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 195561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 19578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState); 195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is WaitForResources */ 196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 196461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateWaitForResources) { 196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Loaded */ 196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateLoaded) { 196761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 196861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 19698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded"); 197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 197161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to WaitForResources */ 197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 19738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources"); 197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState, 197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 197861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Executing */ 197961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 19808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing"); 198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 198261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 198561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Pause */ 198661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 19878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause"); 198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 199161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 199261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Invalid */ 199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 19948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid"); 199561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Loaded - 199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan is NOT tested by Khronos TS */ 200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 20028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState); 200361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 200461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /********************************/ 200761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Invalid */ 200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*******************************/ 200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateInvalid) { 201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* State Transition from Inavlid to any state */ 201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == (OMX_StateLoaded || OMX_StateWaitForResources 201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || OMX_StateIdle || OMX_StateExecuting 201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || OMX_StatePause || OMX_StateInvalid)) { 20148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded"); 201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorInvalidState,\ 201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 2018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (cmd == OMX_CommandFlush) { 20208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued" 202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 202261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 202361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 202461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 20308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Semaphore"); 203161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(param1); 203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 203461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( cmd == OMX_CommandPortEnable) { 20368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued" 203761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 203861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 203961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled = OMX_TRUE; 204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 204161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (m_state == OMX_StateLoaded && 204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || allocate_input_done()) { 204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 204561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 20478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 204861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 205261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 20548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Enable output Port command recieved"); 205561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled = OMX_TRUE; 205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (m_state == OMX_StateLoaded && 205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 205961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (allocate_output_done())) { 206061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 2061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 20648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (cmd == OMX_CommandPortDisable) { 20718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued" 207261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled = OMX_FALSE; 207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 207661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_input_done()) { 207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 2078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 208461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 208561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 208661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 209361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled = OMX_FALSE; 20958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Disable output Port command recieved"); 209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 209761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_output_done()) { 209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 2099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 210661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 210961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 211461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 211561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 21168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd); 211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNotImplemented; 211861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone && bFlag) { 212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 212161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post(&m_cmd_lock); 212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 212561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 213061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ExecuteOmxFlush 2132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 213361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Executes the OMX flush. 2135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan flushtype - input flush(1)/output flush(0)/ both. 2138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 2141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType) 2144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer v4l2_buf; 214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_decoder_cmd dec; 214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("in %s", __func__); 215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH; 215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (flushType) { 215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CORE_INPUT_PORT_INDEX: 215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = true; 215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT; 215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 215761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CORE_OUTPUT_PORT_INDEX: 215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = true; 215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 216061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 216161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = true; 216361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = true; 216461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | 216561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 216661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 216761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 21698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Flush Port (%lu) Failed ", flushType); 217061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = false; 217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 217261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 217361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 2176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush 2177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 217961a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at OUTPUT PORT. 2180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 218261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone. 2183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false 2186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 2187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush() 2188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1 = 0; // Parameter - 1 219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2 = 0; // Parameter - 2 219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident = 0; 219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = true; 219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 219461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Generate FBD for all Buffers in the FTBq*/ 219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 21968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initiate Output Flush"); 219761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_ftb_q.m_size) { 21988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer queue size %d pending buf cnt %d", 219961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.m_size,pending_output_buffers); 220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.pop_entry(&p1,&p2,&ident); 22018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ID(%x) P1(%x) P2(%x)", ident, p1, p2); 220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == m_fill_output_msg ) { 220361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 220461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_FBD) { 220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 220661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 220761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 220861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 220961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = false; 221061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 221161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 221261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 221361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 22158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers); 221661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 2219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush 2220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 222261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at INPUT PORT. 2223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 222561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone. 2226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 222861a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false 2229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 2230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush() 2231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i =0; 223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1 = 0; // Parameter - 1 223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2 = 0; // Parameter - 2 223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident = 0; 223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = true; 223761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Generate EBD for all Buffers in the ETBq*/ 22398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initiate Input Flush"); 224061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 22428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Check if the Queue is empty"); 224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_etb_q.m_size) { 224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 224561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 22478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 224961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_ETB) { 225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers++; 22518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 22558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p", 225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1); 225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 226061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.flush_timestamp(); 226161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Heap Buffers are to be flushed*/ 22628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (arbitrary_bytes && !(codec_config_flag)) { 22638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Reset all the variables before flusing"); 226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count = 0; 226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count = 0; 226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = 0; 227061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 227161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 22728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initialize parser"); 227361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) { 227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_input_pending_q.m_size) { 227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&p1,&p2,&ident); 227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1); 228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 228161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame) { 228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame); 228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 228561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 228661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 228761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 228861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 228961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL, 229061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned int)NULL); 229161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.flush(); 22948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (codec_config_flag) { 22958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer " 22968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "is not sent to the driver yet"); 229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = false; 230061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 230161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 230661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.reset_ts_list(); 230761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 23098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers); 231061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 231561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommandEvent 2317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 231961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Send the event to decoder pipe. This is needed to generate the callbacks 232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan in decoder thread context. 2321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 232261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 2324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 2327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1, 233061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int p2, 233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int id) 2332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (id == m_fill_output_msg || 233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_FBD) { 234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.insert_entry(p1,p2,id); 234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (id == OMX_COMPONENT_GENERATE_ETB || 234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_EBD || 234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.insert_entry(p1,p2,id); 234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cmd_q.insert_entry(p1,p2,id); 234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 23508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this); 235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_message(this, id); 235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 235461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 235561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 2359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNoMore; 236161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!profileLevelType) 236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nPortIndex == 0) { 236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 237061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 2) { 237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 23778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d", 237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->nProfileIndex); 237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 238161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // TODO 238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 23848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d", 238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->nProfileIndex); 238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) { 238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 239161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_H263Level70; 239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 23938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex); 239461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 239961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 240361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 24048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex); 240561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 240861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 240961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 241061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 241161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple; 241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 241461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain; 241561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 24178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex); 241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 241961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 242061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 24228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu", profileLevelType->nPortIndex); 242361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 242461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 242561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 242961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetParameter 2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 243261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 243361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Get Parameter method implementation 2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 243561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 2437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 243861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 243961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Error None if successful. 2440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE paramIndex, 244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_PTR paramData) 2445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 24488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter:"); 244961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 24508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Param in Invalid State"); 2451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 245361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (paramData == NULL) { 24548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get Param in Invalid paramData"); 2455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)paramIndex) { 245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPortDefinition: 245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 246061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 246161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 24628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition"); 246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = update_portdef(portDefn); 246461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 246561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_port_def = *portDefn; 246661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoInit: 246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 247061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *portParamType = 247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 24728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit"); 247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nSize = sizeof(portParamType); 247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nPorts = 2; 247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nStartPortNumber = 0; 247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoPortFormat: 248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 24848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat"); 248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nSize = sizeof(portFmt); 248861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nPortIndex) { 249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nIndex) { 249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = OMX_COLOR_FormatUnused; 249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eCompressionFormat = eCompressionFormat; 249361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 24958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore compression formats"); 249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 249861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (1 == portFmt->nPortIndex) { 249961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nIndex) 250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE) 250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (1 == portFmt->nIndex) 250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar; 250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 25088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore Color formats"); 250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("returning %d", portFmt->eColorFormat); 251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 25138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: Bad port index %d", 251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portFmt->nPortIndex); 251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamAudioInit: 252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 252261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *audioPortParamType = 252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 25248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit"); 252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nSize = sizeof(audioPortParamType); 252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nPorts = 0; 252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nStartPortNumber = 0; 252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamImageInit: 253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 253461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *imagePortParamType = 253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 25368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit"); 253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nSize = sizeof(imagePortParamType); 253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nPorts = 0; 254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nStartPortNumber = 0; 254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 2542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 254561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamOtherInit: 254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 25478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x", 254861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedIndex; 255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 255161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamStandardComponentRole: 255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_COMPONENTROLETYPE *comp_role; 255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 255761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->nSize = sizeof(*comp_role); 255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 25598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d", 256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Added for parameter test */ 256661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPriorityMgmt: 256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 2568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 256961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PRIORITYMGMTTYPE *priorityMgmType = 257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PRIORITYMGMTTYPE *) paramData; 25718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt"); 257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmType->nSize = sizeof(priorityMgmType); 2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 257561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Added for parameter test */ 257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamCompBufferSupplier: 257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 258161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 25828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier"); 258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nSize = sizeof(bufferSupplierType); 258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == bufferSupplierType->nPortIndex) 258761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 258861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (1 == bufferSupplierType->nPortIndex) 258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 259461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 259661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoAvc: 259761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 25988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x", 2599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 260261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoH263: 260361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x", 2605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 260861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg4: 260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x", 261161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 261461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg2: 261561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x", 2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 261961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 262061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoProfileLevelQuerySupported: 262161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex); 262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType = 262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData; 262561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_supported_profile_level_for_1080p(profileLevelType); 262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 262861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: 263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage"); 263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 263461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 263661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED | 263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan GRALLOC_USAGE_PRIVATE_UNCACHED); 263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_ 264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else 264261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 26448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x", (unsigned int)nativeBuffersUsage->nUsage); 264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 26478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!"); 264861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 264961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 265061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 265261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 265361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 265461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 265561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex); 265761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedIndex; 265861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 266061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 26628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)", 266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width, 266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_height, 266561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.stride, 266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.scan_lines); 2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 266861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 267861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((params == NULL) || 267961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (params->nativeBuffer == NULL) || 268061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (params->nativeBuffer->handle == NULL) || 268161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !m_enable_android_native_buffers) 2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_android_native_buffers = OMX_TRUE; 2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sp<android_native_buffer_t> nBuf = params->nativeBuffer; 2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private_handle_t *handle = (private_handle_t *)nBuf->handle; 268661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 2687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buffer = NULL; 268861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 268961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = (OMX_U8*)mmap(0, handle->size, 2690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == MAP_FAILED) { 269261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 269361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 270461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 270561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::Setparameter 2706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 270761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 270861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Set Parameter method implementation. 2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 271061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 2712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 271461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE paramIndex, 271961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR paramData) 2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 27226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal int ret=0; 27236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct v4l2_format fmt; 272461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 27258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Param in Invalid State"); 2726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (paramData == NULL) { 27298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Param in Invalid paramData"); 273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 273261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state != OMX_StateLoaded) && 273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_out_bEnabled == OMX_TRUE) && 273561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_inp_bEnabled == OMX_TRUE)) { 27378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Param in Invalid State"); 2738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 2739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)paramIndex) { 274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPortDefinition: 2742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has 274661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //been called. 27478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d", 274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->format.video.nFrameHeight, 274961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->format.video.nFrameWidth); 275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_DirOutput == portDefn->eDir) { 27518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port"); 275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_display_id = portDefn->format.video.pNativeWindow; 275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffer_size; 275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_buffer_req(buffer_size)) { 27558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error in getting buffer requirements"); 275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount && 275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size ) { 276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual; 276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size = portDefn->nBufferSize; 276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(&drv_ctx.op_buf); 276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_port_def = *portDefn; 276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 27668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)", 276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size, 276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual, portDefn->nBufferSize); 276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (OMX_DirInput == portDefn->eDir) { 277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((portDefn->format.video.xFramerate >> 16) > 0 && 277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) { 277561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Frame rate only should be set if this is a "known value" or to 277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // activate ts prediction logic (arbitrary mode only) sending input 277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // timestamps with max value (LLONG_MAX). 277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu", 277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.xFramerate >> 16); 278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator); 278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.frame_rate.fps_numerator) { 278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 30; 278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator) 278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = (int) 278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator; 279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", 279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int, drv_ctx.frame_rate.fps_numerator / 279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)drv_ctx.frame_rate.fps_denominator); 279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 27968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port"); 279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_resolution.frame_height != 279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight || 279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width != 280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth) { 28018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("SetParam IP: WxH(%d x %d)", 280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth, 280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight); 280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portDefn->format.video.nFrameHeight != 0x0 && 280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth != 0x0) { 280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan update_resolution(portDefn->format.video.nFrameWidth, 280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight); 280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 281061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 28128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width); 281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 28158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Resolution failed"); 281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) { 282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf; 282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 282461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) & 282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (~(buffer_prop->alignment - 1)); 282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(buffer_prop); 282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 28288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)", 282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size, 283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual, portDefn->nBufferSize); 283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portDefn->eDir == OMX_DirMax) { 283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->nPortIndex); 283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoPortFormat: 2841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret=0; 284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 28468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d", 284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat); 284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (1 == portFmt->nPortIndex) { 285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum vdec_output_fromat op_format; 285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) || 285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar)) 285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12; 285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (portFmt->eColorFormat == 286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_COLOR_FORMATTYPE) 286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka) 286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_format = VDEC_YUV_FORMAT_TILE_4x2; 286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.output_format = op_format; 286861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 28708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set output format failed"); 287161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.set_color_format(portFmt->eColorFormat)) { 28798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set color format failed"); 288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 288261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexPortDefn: 2888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt = 289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData; 28918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d", 289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nFramePackingFormat); 289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Input port */ 289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portFmt->nPortIndex == 0) { 289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) { 289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session"); 290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = true; 290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portFmt->nFramePackingFormat == 290561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_FramePacking_OnlyOneCompleteFrame) { 290661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 290761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu", 290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nFramePackingFormat); 291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 291161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 29138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port"); 291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid && 291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nMemRegion < OMX_QCOM_MemRegionMax) && 291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) { 291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_region_smi = OMX_TRUE; 291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 29198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set"); 292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem = OMX_TRUE; 292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamStandardComponentRole: 29286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal { 292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_COMPONENTROLETYPE *comp_role; 293061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 29318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s", 293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->cRole); 293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded)&& 293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Set Parameter called in valid state"); 293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 294461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 294761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 295161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 295861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 296261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 296361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 296461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 296561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) 297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) { 298161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) { 299061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 299461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) || 299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) { 299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 299961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 30008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 300261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 30048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind); 300561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 300661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 300761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 30086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 300961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPriorityMgmt: 3011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state != OMX_StateLoaded) { 30138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 301461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 301561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 30178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d", 301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmtype->nGroupID); 3019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 30208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d", 302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmtype->nGroupPriority); 3022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 302361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 3025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 302661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 302961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamCompBufferSupplier: 30306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal { 303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 30328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d", 303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->eBufferSupplier); 303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 304161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 30436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoAvc: 304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d", 304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 305061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoH263: 305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d", 305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg4: 305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d", 305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg2: 306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d", 306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoDecoderPictureOrder: 306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder = 307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData; 307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pic_order,rc=0; 30748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d", 307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pictureOrder->eOutputPictureOrder); 307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) { 307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) { 307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = pic_order; 308661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 30888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set picture order failed"); 308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamConcealMBMapExtraData: 309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false, 309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 30998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamFrameInfoExtraData: 310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false, 310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 31098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamInterlaceExtraData: 311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false, 311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 31198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamH264TimeInfo: 312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false, 312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 31288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoDivx: 313361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 313461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData; 313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 313761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexPlatformPvt: 313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 31398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port"); 314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData; 314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 314261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type); 314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_pvt_entry_pmem = OMX_TRUE; 314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 31478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set"); 314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem = OMX_TRUE; 314961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 315061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 315161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 315261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 315361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 315461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoSyncFrameDecodingMode: 315561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 315761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode"); 315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 316061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.idr_only_decoding = 1; 316161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 316261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 316361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 316461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 31658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set picture order failed"); 316661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE; 316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE; 317061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 317161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 31728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Sync frame setting failed"); 317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 317461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 317661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 317761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 317961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamIndexExtraDataType: 318061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 318161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 318261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData; 318361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) && 318461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (extradataIndexType->bEnabled == OMX_TRUE) && 318561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (extradataIndexType->nPortIndex == 1)) { 31868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming"); 318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled); 318861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 318961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 319061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 319261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 319361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamEnableSmoothStreaming: 3194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER; 319861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = 1; 319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 320061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc < 0) { 320161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver."); 320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorHardware; 320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 320461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Need to allow following two set_parameters even in Idle 320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * state. This is ANDROID architecture which is not in sync 320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * with openmax standard. */ 321061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: 321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enableNativeBuffers) { 321461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_enable_android_native_buffers = enableNativeBuffers->enable; 321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 321861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: 321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 322061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = use_android_native_buffer(hComp, paramData); 322161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 322261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamEnableTimeStampReorder: 322561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 322661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData; 322761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) { 322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (reorder->bEnable == OMX_TRUE) { 322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int =0; 323061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(true); 323161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 323261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 323361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 323561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (reorder->bEnable == OMX_TRUE) { 323661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 323961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 324061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 324161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 324261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 32438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex); 324461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedIndex; 324561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 324661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 324761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 325161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 325261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetConfig 3253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 325461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Get Config Method implementation. 3256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 325761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 326061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 326361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp, 326561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE configIndex, 326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_PTR configData) 3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 326861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 3269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 327061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 32718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Config in Invalid State"); 327261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 327361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 327461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 327561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)configIndex) { 327661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexConfigInterlaced: 327761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 327861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_CONFIG_INTERLACETYPE *configFmt = 327961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_CONFIG_INTERLACETYPE *) configData; 328061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configFmt->nPortIndex == 1) { 328161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configFmt->nIndex == 0) { 328261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive; 328361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configFmt->nIndex == 1) { 328461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = 328561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 328661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configFmt->nIndex == 2) { 328761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = 328861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 328961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 329061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:" 32918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore Interlaced formats"); 329261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 329361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 329461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 329561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 32968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port", 329761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)configFmt->nPortIndex); 329861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 329961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 330061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 330161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 330261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexQueryNumberOfVideoDecInstance: 330361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 330461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances = 330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData; 330661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoderinstances->nNumOfInstances = 16; 330761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexConfigVideoFramePackingArrangement: 331161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 331261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 331361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt = 331461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData; 331561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->get_frame_pack_data(configFmt); 331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 331761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs"); 331861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 331961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 332061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 332161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexConfigCommonOutputCrop: 332261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 332361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 332461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE)); 332561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 332661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 332761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 332861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 33298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex); 333061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 333161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 333261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 333361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 333461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 333561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 333961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 334061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SetConfig 3341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 334261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 334361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Set Config method implementation 3344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 334561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 334961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 335061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp, 335261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE configIndex, 335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR configData) 3354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 33568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Config in Invalid State"); 335761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 336161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_CONFIG_NALSIZE *pNal; 336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set Config Called"); 336461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 336561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateExecuting) { 33668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("set_config:Ignore in Exe state"); 336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 336861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 337061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) { 337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData; 33728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData called"); 337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) { 33748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData AVC"); 337561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 extra_size; 337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Parsing done here for the AVC atom is definitely not generic 337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Currently this piece of code is working, but certainly 337861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // not tested with all .mp4 files. 337961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Incase of failure, we might need to revisit this 338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // for a generic piece of code. 338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 338261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Retrieve size of NAL length field 338361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // byte #4 contains the size of NAL lenght field 338461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length = (config->pData[4] & 0x03) + 1; 338561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 338661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_size = 0; 338761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length > 2) { 338861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Presently we assume that only one SPS and one PPS in AvC1 Atom */ 338961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_size = (nal_length - 2) * 2; 339061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 339161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 339261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // SPS starts from byte #6 339361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]); 339461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pDestBuf; 3395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 339761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // minus 6 --> SPS starts from byte #6 339861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // minus 1 --> picture param set byte to be ignored from avcatom 339961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size; 340061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize); 340161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 len; 340261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 index = 0; 340361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // case where SPS+PPS is sent as part of set_config 340461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf = m_vendor_config.pData; 340561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 34068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]", 340761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex, 340861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize, 340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData); 341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (index < 2) { 341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint8 *psize; 341261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = *pSrcBuf; 341361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = len << 8; 341461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len |= *(pSrcBuf + 1); 341561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psize = (uint8 *) & len; 341661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(pDestBuf + nal_length, pSrcBuf + 2,len); 341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (unsigned int i = 0; i < nal_length; i++) { 341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf[i] = psize[nal_length - 1 - i]; 341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 342061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //memcpy(pDestBuf,pSrcBuf,(len+2)); 342161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf += len + nal_length; 342261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pSrcBuf += len + 2; 342361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index++; 342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pSrcBuf++; // skip picture param set 342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = 0; 342661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 342761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") || 342861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) { 3429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 3430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize = config->nDataSize; 343161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize)); 343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData,config->nDataSize); 343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) { 343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_vendor_config.pData) { 343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_vendor_config.pData); 343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = NULL; 343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = 0; 343861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (((*((OMX_U32 *) config->pData)) & 344161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE_MASK) == 344261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE) { 34438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 simple/main profile"); 344461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 344561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 344661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = 344761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *) malloc(config->nDataSize); 344861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData, 344961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan config->nDataSize); 345061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_SP_MP_RCV; 345161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) { 34528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 Advance profile"); 345361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 345461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 345561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = 345661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *) malloc((config->nDataSize)); 345761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData, 345861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan config->nDataSize); 345961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_AP; 346061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) { 34618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only"); 346261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 346361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 346461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize); 346561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData,config->pData,config->nDataSize); 346661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_SP_MP_RCV; 346761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 34688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile"); 346961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 347161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configIndex == OMX_IndexConfigVideoNalSize) { 347361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 347461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData); 347561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length = pNal->nNaluBytes; 347661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 34778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d",nal_length); 347861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 348161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 348561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 348661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetExtensionIndex 3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 348861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 348961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX GetExtensionIndex method implementaion. <TBD> 3490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 349161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 349261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 349461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 349561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 349761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 349961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_STRING paramName, 350061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_INDEXTYPE* indexType) 3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 350261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 35038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Extension Index in Invalid State"); 3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 350561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) { 3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode; 350761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) { 3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType; 3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 351161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) { 3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 351361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) { 3514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 351561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) { 35168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extension: %s is supported", paramName); 3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 351861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) { 3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 3520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 352261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 35238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName); 3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNotImplemented; 3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 353061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 353161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetState 3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 353361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 353461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns the state information back to the caller.<TBD> 3535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 353661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 353761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 353961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 354061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Error None if everything is successful. 354161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp, 354361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STATETYPE* state) 3544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 354561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *state = m_state; 35468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_state: Returning the state %d",*state); 354761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 355161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 355261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentTunnelRequest 3553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 355461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 355561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Component Tunnel Request method implementation. <TBD> 3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 355761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 355861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 3559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 356061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 356161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 3562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 356361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 356561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 356661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE peerComponent, 356761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 peerPort, 356861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 3569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 35708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented"); 357161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 3572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 357561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 357661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseOutputBuffer 3577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 357861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 357961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper function for Use buffer in the input pin 3580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 358161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 358261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 3583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 358461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 358561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 3586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 358761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 35886eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_extradata() 35896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 35906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 359161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.buffer_size) { 359261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) { 359361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 359461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 359561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 359661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 359761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095); 35988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("allocate extradata memory size %d", drv_ctx.extradata_info.size); 359961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory( 360061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size, 4096, 360161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.extradata_info.ion.ion_alloc_data, 360261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.extradata_info.ion.fd_ion_data, 0); 360361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.ion.ion_device_fd < 0) { 36048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to alloc extradata memory"); 360561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 360661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 360761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.uaddr = (char *)mmap(NULL, 360861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size, 360961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, 361061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.ion.fd_ion_data.fd , 0); 361161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.uaddr == MAP_FAILED) { 36128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to map extradata memory"); 361361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 361461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 361561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 361661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 361761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size); 361861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 362061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 36216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 36226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 362361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_extradata() 362461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 36256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 362661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.uaddr) { 362761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 362861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 362961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 363061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 363161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 36326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 36336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 36346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 3635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_output_buffer( 363661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 363761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 363861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 363961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 364061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 364161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 364361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 364461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 364561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; // Temporary counter 364661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 364761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PTR privateAppData = NULL; 364861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan private_handle_t *handle = NULL; 364961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *buff = buffer; 365061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 365161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 365261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 36536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 365461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 365561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers"); 365661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_output_headers(); 365761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 365861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_extradata(); 365961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 366061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 366161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 366261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 366361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,i)) { 366461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 366561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 366761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 366861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 366961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i >= drv_ctx.op_buf.actualcount) { 36708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount); 367161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 367261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 367461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 367561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 367661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 367761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_use_android_native_buffers) { 367861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 367961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sp<android_native_buffer_t> nBuf = params->nativeBuffer; 368061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle = (private_handle_t *)nBuf->handle; 368161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = params->pAppPrivate; 368261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 368361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle = (private_handle_t *)buff; 368461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 368561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 368661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 368761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 368861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 368961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " expected %u, got %lu", 369061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size); 369161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 369261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 369361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 369461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size; 369561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_use_android_native_buffers) { 369661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 369761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buff = (OMX_U8*)mmap(0, handle->size, 369861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 369961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buff == MAP_FAILED) { 370061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 370161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 370261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 37036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 37046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 37056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#if defined(_ANDROID_ICS_) 370661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan native_buffer[i].nativehandle = handle; 370761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan native_buffer[i].privatehandle = handle; 37086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 370961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!handle) { 371061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 371161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 371261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 371361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 371461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = 0; 371561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 371661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = 371761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 371861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 3719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 372161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ouput_egl_buffers && !m_use_output_pmem) { 3722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 37238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("allocate output buffer memory size %d", drv_ctx.op_buf.buffer_size); 372461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 372561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 372661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 372761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0); 372861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 37298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd); 373061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 373161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 373261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 373361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 3734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 373561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 373661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan open (MEM_DEVICE,O_RDWR); 3737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 373861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 37398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 374061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 374161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 374361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */ 374461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) { 374561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 374661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan open (MEM_DEVICE,O_RDWR); 374761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 37488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 374961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 375061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 375161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 375361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 375461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size, 375561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment)) { 37568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 375761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 375861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 375961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 376161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 376261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 376361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 376461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, 376561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 376661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 376761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 3768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 376961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 3770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 37718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unable to mmap output buffer"); 377261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 377361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 377461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 377561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = 0; 377661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 377761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 377861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 377961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem); 378061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!appData || !bytes ) { 378161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && !buffer) { 37828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case"); 378361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 378461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 378561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 378661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 378761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 378861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 378961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 379061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pmem_list->entryList || !pmem_list->entryList->entry || 379161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !pmem_list->nEntries || 379261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 37938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pmem info not valid in use buffer"); 379461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 379561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 379661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 379761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list->entryList->entry; 379861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x", 379961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info->pmem_fd); 380061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 380161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 380261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 380361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = 380461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 380561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 3806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 380761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 380861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd; 380961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 381061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_out_mem_ptr + i ); 381161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 381261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 381361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 381461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 381561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 381661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i, 381861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr, 381961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd ); 382061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 382161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 382261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 382361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 382461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 382561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 382661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 382761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd; 382861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 382961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 383061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 383161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 383261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 383361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 383461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION 383561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 383661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 383761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 383861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 383961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 38408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 384161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 3842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 384361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 384461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 384561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]); 3847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 384861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) { 38498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to prepare bufs"); 385061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 385161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 3852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 385461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) { 385561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 385661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 385761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) { 385861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 385961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 386061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = true; 38618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("STREAMON Successful"); 386261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 386461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 386561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 386661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 386761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle); 386861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = (OMX_U8 *)handle; 386961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 387061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = buff; 387161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 387261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pAppPrivate = privateAppData; 387361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_out_bm_count,i); 387461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 387561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 387961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 388061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::use_input_heap_buffers 3881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 388261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 388361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use Buffer Heap allocation method implementation. 3884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 388561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 388661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 388861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 388961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None , if everything successful. 3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 389161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_input_heap_buffers( 389361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 389461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 389561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 389661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 389761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 389861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 39008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer); 390161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 390261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_heap_ptr) 390361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 390461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 390561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 390661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_phdr_pmem_ptr) 390761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 390861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 390961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 391061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) { 391161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficent memory"); 391261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 391361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) { 391461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_use_buffer = true; 391561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 391661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 391761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 391861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 391961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 392061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 392161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 392261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 39238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 392461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], 392561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 39268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 392761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 392861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 392961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_in_alloc_cnt++; 393061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 393161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("All i/p buffers have been set!"); 393261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 393361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 393461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 393861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 393961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseBuffer 3940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 394161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 394261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use Buffer method implementation. 3943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 394461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 394561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 394761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 394861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None , if everything successful. 3949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 395061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_buffer( 395261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 395361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 395461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 395561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 395661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 395761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 395961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE error = OMX_ErrorNone; 396061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 396161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 396261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || bytes == 0) { 396361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && buffer == NULL) { 396461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer); 396561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 396661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 396761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 396861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 39698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Use Buffer in Invalid State"); 397061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 397161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 397261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) 397361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 397461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (port == OMX_CORE_OUTPUT_PORT_INDEX) 397561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested 397661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 39778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 397861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = OMX_ErrorBadPortIndex; 397961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 398061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error); 398161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error == OMX_ErrorNone) { 398261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 398361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 398461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 398561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandStateSet,OMX_StateIdle, 398661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 398761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 398861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 398961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 399061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 399161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 399261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX, 399361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 399461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 399561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 399661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 399761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 399861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 399961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 400061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 400161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 400261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return error; 400361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 4004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex, 400661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *pmem_bufferHdr) 4007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 400861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) { 400961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr[bufferindex].pBuffer) 401061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_inp_heap_ptr[bufferindex].pBuffer); 401161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[bufferindex].pBuffer = NULL; 401261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 401361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_bufferHdr) 401461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(pmem_bufferHdr); 401561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 402061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 402161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || m_inp_mem_ptr == NULL) { 402261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 402361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 402561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufferHdr - m_inp_mem_ptr; 40268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 402761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 402861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) { 40298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 403061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) { 403161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 403261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT; 403361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 403461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 40358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the input buffer fd=%d", 4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].pmem_fd); 40378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the input buffer size=%d address = %d", 4038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].mmaped_size, 4039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].bufferaddr); 404061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 404161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].mmaped_size); 404261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.ptr_inputbuffer[index].pmem_fd); 404361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 404461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) { 404561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_desc_buffer_ptr[index].buf_addr); 404661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].buf_addr = NULL; 404761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].desc_data_size = 0; 404861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 405061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 405261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 405561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 406061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 4061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 406261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || m_out_mem_ptr == NULL) { 406361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 406461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 406661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufferHdr - m_out_mem_ptr; 40678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index); 4068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 406961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < drv_ctx.op_buf.actualcount 407061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_outputbuffer) { 40718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %x", index, 407261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].bufferaddr); 4073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 407461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 407561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 407661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 407761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 407961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 408061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 408161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 408261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].mmaped_size); 408361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 408461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 408561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 4086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 408761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) { 40888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the output buffer fd = %d", 408961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].pmem_fd); 40908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the ouput buffer size=%d address = %d", 409161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount, 409261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].bufferaddr); 409361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr, 409461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount); 409561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.ptr_outputbuffer[0].pmem_fd); 409661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].pmem_fd = -1; 4097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 409861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[0]); 4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 410061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 410261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 410461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 410561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_extradata(); 410661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 4108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 410961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 4110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 411461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE **bufferHdr, 411561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 port, 411661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PTR appData, 411761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 bytes) 4118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 411961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *input = NULL; 412061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *buf_addr = NULL; 412161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 412261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i = 0; 412361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 412461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Sanity Check*/ 412561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL) { 412661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 412761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 412861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 412961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr == NULL) { 413061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 413161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 413261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 413361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 413461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 413561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 413661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 413761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr == NULL) { 41388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("m_inp_heap_ptr Allocation failed "); 413961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 414061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 414161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 414261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 414361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Find a Free index*/ 414461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 414561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) { 41468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 414761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 414861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 414961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 415061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 415161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.ip_buf.actualcount) { 415261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 415361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 415461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_addr == NULL) { 415561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 415661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 415761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 415861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_inp_heap_ptr + i); 415961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input = *bufferHdr; 416061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_heap_inp_bm_count,i); 416161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 416261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)buf_addr; 416361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 416461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nVersion.nVersion = OMX_SPEC_VERSION; 416561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nAllocLen = drv_ctx.ip_buf.buffer_size; 416661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pAppPrivate = appData; 416761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 41688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr ); 416961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 41708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]); 417161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Add the Buffers to freeq*/ 417261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i], 417361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 41748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 417561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 417661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 417761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 417861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 417961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 418061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 418161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 418761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 418861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateInputBuffer 4189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 419161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper function for allocate buffer in the input pin 4192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 419461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 419761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_buffer( 420161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 420261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 420361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 420461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 420561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 420861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 420961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 421061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *input = NULL; 421161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i = 0; 421261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *buf_addr = NULL; 421361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pmem_fd = -1; 4214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 421561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bytes != drv_ctx.ip_buf.buffer_size) { 42168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Requested Size is wrong %d epected is %d", 421761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes, drv_ctx.ip_buf.buffer_size); 421861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 421961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 422161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_mem_ptr) { 42228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%d)", 422361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount, 422461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size); 4225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 422661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 422761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 4228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 422961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr == NULL) { 423061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 423161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 423361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \ 423461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount); 4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 423661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer == NULL) { 423761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 423861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 424061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \ 424161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount); 4242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 424361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ip_buf_ion_info == NULL) { 424461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 424561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 424861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.ip_buf.actualcount; i++) { 424961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 4250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 425161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 4252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 425361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 425661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 425761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 42588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 425961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 426061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 426361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.ip_buf.actualcount) { 426461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 426561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 426661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 42676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 4268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 42698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Allocate input Buffer size %d", drv_ctx.ip_buf.buffer_size); 427061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 427161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 427261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 427361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0); 427461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 427561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 427661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 427761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 427961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 428161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 42828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 428361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 428461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 428661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd == 0) { 428761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 428961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 42908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 429161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 429261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 429361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 429561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size, 429661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment)) { 42978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 429861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 429961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 430061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 430261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 430361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_addr = (unsigned char *)mmap(NULL, 430461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size, 430561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 4306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 430761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_addr == MAP_FAILED) { 430861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 4309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 431061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 4311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 43128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Map Failed to allocate input buffer"); 431361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 431461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 431561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 431661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_inp_mem_ptr + i); 431761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 431861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr; 431961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 432061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 432161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 432261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 432361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 432461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].offset = 0; 432561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 432661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 432761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 432861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 432961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 433061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.bytesused = 0; 433161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size; 433261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr; 433361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd; 433461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[1] = 0; 433561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset; 433661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = &plane; 433761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = 1; 433861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]); 434061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 434161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 434261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 434361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 43448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to prepare bufs"); 434561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 434661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 4347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 434961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input = *bufferHdr; 435061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_inp_bm_count,i); 43518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr); 435261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 435361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd; 435461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 435561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)buf_addr; 435661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 435761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nVersion.nVersion = OMX_SPEC_VERSION; 435861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nAllocLen = drv_ctx.ip_buf.buffer_size; 435961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pAppPrivate = appData; 436061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 436161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; 436261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 436361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.disable_dmx) { 436461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_desc_buffer(i); 436561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 436661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found"); 436861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 436961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 437061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 437561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 437661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateOutputBuffer 4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 437861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 437961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper fn for AllocateBuffer in the output pin 4380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 438161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 438261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 4383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 438461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 438561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went well. 4386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 438761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_buffer( 438961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 439061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 439161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 439261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 439361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 439561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 439661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 439761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; // Temporary counter 439861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 439961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 4400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 440161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ion_device_fd =-1; 440261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_allocation_data ion_alloc_data; 440361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_fd_data fd_ion_data; 4404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 440561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 44068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%d)", 440761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount, 440861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 440961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nBufHdrSize = 0; 441061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformEntrySize = 0; 441161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformListSize = 0; 441261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPMEMInfoSize = 0; 441361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pmem_fd = -1; 441461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *pmem_baseaddress = NULL; 441561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 441661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 441761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 441861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 441961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)", 442161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 442261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufHdrSize = drv_ctx.op_buf.actualcount * 442361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE); 442461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 442561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize = drv_ctx.op_buf.actualcount * 442661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 442761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize = drv_ctx.op_buf.actualcount * 442861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 442961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformEntrySize = drv_ctx.op_buf.actualcount * 443061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 443161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize, 443361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE), 443461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize, 443561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize); 44368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize, 443761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 44398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("allocate outputBuffer size %d",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount); 444061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_device_fd = alloc_map_ion_memory( 444161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount, 444261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment, 444361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0); 444461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ion_device_fd < 0) { 444561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 444661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 444761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = fd_ion_data.fd; 4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 444961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 445161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 44528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d", 445361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 445461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 445561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 445761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd == 0) { 445861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 446061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 44618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d", 446261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 446361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 446461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 446561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 446761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size * 446861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount, 446961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment)) { 44708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 447161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 447261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 447361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 447561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 447661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress = (unsigned char *)mmap(NULL, 447761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.op_buf.buffer_size * 447861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount), 447961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 448061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_baseaddress == MAP_FAILED) { 44818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("MMAP failed for Size %d", 448261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 448361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 4484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 4486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 448761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 448861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 448961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 449061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 449161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Alloc mem for platform specific info 449261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *pPtr=NULL; 449361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 449461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize,1); 449561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\ 449661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_bufferpayload), 449761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 449861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 449961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo), 450061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 450261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = (struct vdec_ion *)\ 450361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_ion), 450461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 450761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 450861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_respbuffer) { 450961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size = 451061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.op_buf.buffer_size * 451161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 451261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr = m_out_mem_ptr; 451361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 451461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 451561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_list) + nPlatformListSize); 451661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 451761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_entry) + nPlatformEntrySize); 451861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList = m_platform_list; 451961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry = m_platform_entry; 452061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = m_pmem_info; 452161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 45228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 452361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 452461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Settting the entire storage nicely 45258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry); 45268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 452761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 452861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 452961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 453061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Set the values when we determine the right HxW param 453161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nAllocLen = bytes; 453261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nFilledLen = 0; 453361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pAppPrivate = appData; 453461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 453561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Platform specific PMEM Information 453661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform Entry 45378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i); 453861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 453961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->entry = pPMEMInfo; 454061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform List 454161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->nEntries = 1; 454261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->entryList = pPlatformEntry; 454361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep pBuffer NULL till vdec is opened 454461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pBuffer = NULL; 454561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOffset = 0; 454661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 454761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i; 454861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->pmem_fd = 0; 454961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pPlatformPrivate = pPlatformList; 455061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 455161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd; 455261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].pmem_fd = pmem_fd; 4553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 455461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd; 455561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data; 455661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data; 4557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 455961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create a mapping between buffers*/ 456061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 456161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 456261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ptr_outputbuffer[i]; 456361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i; 456461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 456561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i); 456661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 45678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pmem_fd = %d offset = %d address = %p", 456861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd, drv_ctx.ptr_outputbuffer[i].offset, 456961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr); 457061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the buffer and buffer header pointers 457161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr++; 457261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo++; 457361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry++; 457461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList++; 457561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 457661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 45778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 457861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr, pPtr); 457961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 458061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_out_mem_ptr); 458161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 458261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 458361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pPtr) { 458461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(pPtr); 458561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = NULL; 458661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 458761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 458861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_outputbuffer); 458961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 459061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 459161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 459261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_respbuffer); 459361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 459461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 459661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info) { 45978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 459861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 459961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = NULL; 460061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 460261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 460361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 460461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 460561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_extradata(); 460661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 460761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 460861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 460961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,i)) { 46108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i); 461161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 461261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 461561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 461661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.op_buf.actualcount) { 461761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 461861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 461961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 462061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 462161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 462261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = 462361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size; 462461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 462561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_out_mem_ptr + i ); 462661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 462761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 462861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 462961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size; 463061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 463161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 463261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 463361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 463461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 463561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 463661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 46376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 463861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 46396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 464061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 464161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 464261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 464361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 464461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 464561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 4646b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION 464761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 4648b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif 464961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 465061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 465161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 46528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx); 465361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 465461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 465561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 465661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 46578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]); 465861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 465961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 466061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 466161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 466261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 466361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 466461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 466561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 466661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 466761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 466861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 466961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 467061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 467161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = true; 46728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("STREAMON Successful"); 467361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 467461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 467561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 467661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 467761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pAppPrivate = appData; 467861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_out_bm_count,i); 467961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 46808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient"); 468161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 468261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 468561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer -- API Call 4690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 469161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 469261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateBuffer 4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 469461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 469561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 4696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 469761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 469861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 470061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 470161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 470361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 470561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 470661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 470761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 470861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i = 0; 4711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 4712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 47138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port); 471461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 47158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Allocate Buf in Invalid State"); 4716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 4717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 471961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 472061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 472161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes); 472261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 472361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); 472461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 472561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 47266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port, 47276eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal appData,bytes); 472861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 47298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 473061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 4731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 473361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 473461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done()) { 473561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 4738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet,OMX_StateIdle, 473961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 474261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) { 474361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 474461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 474561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX, 4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 474861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 475061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) { 475161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 475261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 4753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 475461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 475561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 47598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet); 4760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call 4764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 476561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 476661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::FreeBuffer 4767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 476861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 4769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 477061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 477161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 477361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 477461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 477661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 477861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 477961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 4780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 4782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int nPortIndex; 47838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("In for decoder free_buffer"); 4784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 478561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateIdle && 478661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 47878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" free buffer while Component in Loading pending"); 478861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 478961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) { 47908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Buffer while port %d disabled", port); 479161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((port == OMX_CORE_INPUT_PORT_INDEX && 479261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) || 479361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (port == OMX_CORE_OUTPUT_PORT_INDEX && 479461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) { 47958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Buffer while port %d enable pending", port); 479661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) { 47978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled"); 4798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 479961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorPortUnpopulated, 480061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 480361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_state != OMX_StateInvalid) { 48048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers"); 4805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 480661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorPortUnpopulated, 480761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 481061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 481161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if arbitrary bytes*/ 481261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes && !input_use_buffer) 481361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer - m_inp_mem_ptr; 481461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 481561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer - m_inp_heap_ptr; 4816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex); 481861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex < drv_ctx.ip_buf.actualcount) { 481961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Clear the bit associated with it. 482061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 482161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 482261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 482361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 48248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex); 482561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) 482661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 482761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 482861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 482961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) 483061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]); 483161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 483261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(nPortIndex,NULL); 483361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 483461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(buffer); 4835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 483661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated = OMX_FALSE; 483761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Free the Buffer Header*/ 483861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_input_done()) { 48398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("ALL input buffers are freed/released"); 484061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer_header(); 484161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 484261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 48438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid"); 4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 484761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 484861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_input_done()) { 48498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 4850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 4851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortDisable, 485261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX, 485361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 485561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 4856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // check if the buffer is valid 48576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 485861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex < drv_ctx.op_buf.actualcount) { 48598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex); 4860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Clear the bit associated with it. 4861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 4862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bPopulated = OMX_FALSE; 48636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal client_buffers.free_output_buffer (buffer); 4864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 486561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 486661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_output_buffer_header(); 4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 486861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 48698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid"); 4870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 487261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 487361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_output_done()) { 48748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it"); 4875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 487761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 48786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_ 487961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 488061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 488161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 488261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 48836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 4884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 488561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable, 488661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 488761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 488961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 4890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 489261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((eRet == OMX_ErrorNone) && 489361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 489461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_done()) { 4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet, OMX_StateLoaded, 489861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 490661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 490761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::EmptyThisBuffer 4908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 490961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 491061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan This routine is used to push the encoded video frames to 491161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the video decoder. 4912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 491361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 491461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 491661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 491761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went successful. 4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 491961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 492161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 4922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 492361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret1 = OMX_ErrorNone; 492461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 4925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 49268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 49278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan codec_config_flag = true; 49288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__); 49298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 493061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 49318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Empty this buffer in Invalid State"); 493261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 493361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 493561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL) { 49368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL"); 493761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 493861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 494061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_bEnabled) { 49418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled."); 494261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 494361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 494561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) { 49468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %lu", buffer->nInputPortIndex); 494761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 494861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 495061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ 495161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (iDivXDrmDecrypt) { 495261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer); 495361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drmErr != OMX_ErrorNone) { 495461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // this error can be ignored 49558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ERROR:iDivXDrmDecrypt->Decrypt %d", drmErr); 495661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 495761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 495861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif //_ANDROID_ 495961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 496061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!latency) { 496161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.stop(); 496261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan latency = dec_time.processing_time_us(); 496361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 496461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 496561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 496661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 496761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 496861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_heap_ptr; 496961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 497061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 497161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_heap_ptr; 497261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 497361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 497461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 497561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = &m_inp_mem_ptr[nBufferIndex]; 497661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d", 497761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen); 497861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 497961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_mem_ptr; 498061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 498161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 498261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 498361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nBufferIndex > drv_ctx.ip_buf.actualcount ) { 49848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid"); 498561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 498661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 498761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 498861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)", 498961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen); 499061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 499161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned)hComp,(unsigned)buffer, 499261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_ETB_ARBITRARY); 499361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 499461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_TIMEINFO_EXTRADATA)) 499561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(buffer->nTimeStamp); 499661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB); 499761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 499961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 500061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 500161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/* ====================================================================== 500261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 500361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::empty_this_buffer_proxy 500461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 500561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 500661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan This routine is used to push the encoded video frames to 500761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the video decoder. 500861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 500961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 501061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 501161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 501261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 501361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went successful. 501461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 501561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 501661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 501761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 501861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 501961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int push_cnt = 0,i=0; 502061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned nPortIndex = 0; 502161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 502261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_input_frameinfo frameinfo; 502361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *temp_buffer; 502461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_seqheader seq_header; 502561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool port_setting_changed = true; 502661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool not_coded_vop = false; 502761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 502861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Should we generate a Aync error event*/ 502961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || buffer->pInputPortPrivate == NULL) { 50308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid"); 503161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 503261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 503361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 503461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 503561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 503661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex > drv_ctx.ip_buf.actualcount) { 50378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 503861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex); 503961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 504061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 504161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 504261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers++; 504361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 504461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return zero length and not an EOS buffer */ 504561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes && (buffer->nFilledLen == 0) && 504661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) { 50478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("return zero legth buffer"); 504861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 504961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 505061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 505161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 505461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) { 505561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4StreamType psBits; 505661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset); 505761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.numBytes = buffer->nFilledLen; 505861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4_headerparser.parseHeader(&psBits); 505961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan not_coded_vop = mp4_headerparser.is_notcodec_vop( 506061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 506161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (not_coded_vop) { 50628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Found Not coded vop len %lu frame number %u", 506361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen,frame_count); 506461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 50658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Eos and Not coded Vop set len to zero"); 506661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan not_coded_vop = false; 506761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 506861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 507261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_flush_progress == true 5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 507461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || not_coded_vop 5075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 507661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 50778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush in progress return buffer "); 507861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 507961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 508061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 508161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 508261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 508361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate; 508461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 508561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) { 508661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 508761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 508861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 50898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 509061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*for use buffer we need to memcpy the data*/ 509161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer->buffer_len = buffer->nFilledLen; 509261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 509361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer) { 509461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen <= temp_buffer->buffer_len) { 509561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 509661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 509761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 509861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset), 509961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen); 510061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 510161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 510261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 510361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 510461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 510561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 510661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 510761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr = temp_buffer->bufferaddr; 510861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.client_data = (void *) buffer; 510961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.datalen = temp_buffer->buffer_len; 511061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags = 0; 511161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.offset = buffer->nOffset; 511261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_fd = temp_buffer->pmem_fd; 511361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_offset = temp_buffer->offset; 511461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.timestamp = buffer->nTimeStamp; 511561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) { 511661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("ETB: dmx enabled"); 511761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_demux_entries == 0) { 511861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extract_demux_addr_offsets(buffer); 511961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 512061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 512161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries); 512261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle_demux_data(buffer); 512361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr; 512461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size; 512561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 512661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_addr = NULL; 512761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_size = 0; 512861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 512961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 513061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= buffer->nFlags; 5131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 513461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 513561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 51368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 513761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.insert_ts(buffer->nTimeStamp); 513861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 51398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 514061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.insert_ts(buffer->nTimeStamp); 514161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 514261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 514661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (inputBufferFile1) { 514761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fwrite((const char *)temp_buffer->bufferaddr, 514861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer->buffer_len,1,inputBufferFile1); 514961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 515261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { 515361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 515461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 515561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 515661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 515761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 51588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached"); 515961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= VDEC_BUFFERFLAG_EOS; 516061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 516161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count = 0; 516261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 516361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count = 0; 516461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) 516561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 516661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.flush(); 516761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 516861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = 0; 516961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 517061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 517161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 517261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 517361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 517461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&buf, 0, sizeof(buf)); 517561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&plane, 0, sizeof(plane)); 517661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 517761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned long print_count; 517861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 51798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan buf.flags = V4L2_QCOM_BUF_FLAG_EOS; 51808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("INPUT EOS reached") ; 518161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 518261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 518361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = nPortIndex; 518461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 518561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 518661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.bytesused = temp_buffer->buffer_len; 518761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.length = drv_ctx.ip_buf.buffer_size; 518861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.m.userptr = (unsigned long)temp_buffer->bufferaddr - 518961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)temp_buffer->offset; 519061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[0] = temp_buffer->pmem_fd; 519161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[1] = temp_buffer->offset; 519261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.data_offset = 0; 519361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = &plane; 519461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = 1; 519561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frameinfo.timestamp >= LLONG_MAX) { 519661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID; 519761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 519861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //assumption is that timestamp is in milliseconds 519961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.timestamp.tv_sec = frameinfo.timestamp / 1000000; 520061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000); 520161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0; 520261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 520361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 520461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 52058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver"); 520661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 520761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 52088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan codec_config_flag = false; 52098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("%s: codec_config cleared", __FUNCTION__); 52108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 521161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!streaming[OUTPUT_PORT]) { 521261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 521361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret,r; 521461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 521561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 52168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 521761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 521861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ret) { 52198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful"); 522061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[OUTPUT_PORT] = true; 522161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 522261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 52238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT"); 522461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued"); 522561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 522661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 522761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 522861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 522961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 523061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)", 523161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen); 523261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.insert_timestamp(buffer); 5233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 523461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 5235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 523861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 523961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::FillThisBuffer 5240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 524161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 524261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL client uses this method to release the frame buffer 524361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan after displaying them. 5244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 524561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 524661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 524861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 524961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 525161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 525361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 525661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 52578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("FTB in Invalid State"); 525861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 525961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 526061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 526161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_bEnabled) { 52628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled."); 526361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 526461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 526561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 526661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || 526761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount)) { 526861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 526961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 527061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 527161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) { 52728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex); 527361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 527461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 527561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 527661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 527761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg); 527861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 528161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 528261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::fill_this_buffer_proxy 5283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 528461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 528561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL client uses this method to release the frame buffer 528661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan after displaying them. 5287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 528861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 528961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 529161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 529261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 529461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( 529661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 529761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 5298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 529961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE nRet = OMX_ErrorNone; 530061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 530161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned nPortIndex = 0; 530261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_fillbuffer_cmd fillbuffer; 530361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *ptr_outputbuffer = NULL; 530461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *ptr_respbuffer = NULL; 530561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 530661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 530761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 530861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) 530961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 531061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 53118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", 531261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferAdd, bufferAdd->pBuffer); 531361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Return back the output buffer to client*/ 531461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) { 53158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Output Buffers return flush/disable condition"); 531661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 531761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,buffer); 531861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 531961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 532061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers++; 532161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = client_buffers.get_dr_buf_hdr(bufferAdd); 532261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate; 532361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptr_respbuffer) { 532461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data; 532561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 532661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 532761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) { 532861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 532961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 533061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,buffer); 533161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers--; 533261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 533361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 533461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 533561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 533661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 533761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 533861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&buf, 0, sizeof(buf)); 533961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 534061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 534161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 534261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = nPortIndex; 534361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 534461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 534561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].bytesused = buffer->nFilledLen; 534661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 534761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = 534861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr - 534961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset; 535061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 535161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 535261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 535361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 535461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 535561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].bytesused = 0; 535661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 535761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size); 53586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 535961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 53606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 536161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size; 536261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 536361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 53648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index higher than expected: %d", extra_idx); 536561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 536661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 536761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 536861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 536961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 537061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 537161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 537261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to qbuf to driver"); 537361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 537461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 537861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 537961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SetCallbacks 5380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 538261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Set the callbacks. 5383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 538561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 538861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 5389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 539061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 539261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_CALLBACKTYPE* callbacks, 539361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData) 5394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 539661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb = *callbacks; 53978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 539861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EventHandler,m_cb.FillBufferDone); 539961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_app_data = appData; 540061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 5401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 540461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 540561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentDeInit 5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 540761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 540861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Destroys the component and release memory allocated to the heap. 5409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 541061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 541161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 541361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 541461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 5415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 541661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 5418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 542061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (iDivXDrmDecrypt) { 5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete iDivXDrmDecrypt; 5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt=NULL; 5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 54266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal unsigned i = 0; 542761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_StateLoaded != m_state) { 54288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\ 542961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state); 54308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Playback Ended - FAILED"); 543161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 54328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Playback Ended - PASSED"); 5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the output buffers have to be cleaned up*/ 543661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 54378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Freeing the Output Memory"); 543861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) { 543961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_output_buffer (&m_out_mem_ptr[i]); 5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 544161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_ 544261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 544361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 5444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the input buffers have to be cleaned up*/ 544761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr || m_inp_heap_ptr) { 54488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Freeing the Input Memory"); 544961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) { 545061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) 545161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer (i,&m_inp_mem_ptr[i]); 545261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 545361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer (i,NULL); 5454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer_header(); 5457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer_header(); 545861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer) { 5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(h264_scratch.pBuffer); 5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer = NULL; 5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 546361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_parser) { 5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete h264_parser; 546561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser = NULL; 5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 546861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_platform_list) { 5469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_platform_list); 5470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = NULL; 5471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 547261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_vendor_config.pData) { 5473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_vendor_config.pData); 5474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = NULL; 5475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Reset counters in mesg queues 5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_size=0; 5479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_size=0; 5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_size=0; 5481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_read = m_ftb_q.m_write =0; 5482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_read = m_cmd_q.m_write =0; 5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_read = m_etb_q.m_write =0; 5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 548561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 548661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.reset_ts_list(); 5487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 54908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG"); 5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 549261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // NULL); 54938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Close the driver instance"); 54946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 5495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 5496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (inputBufferFile1); 5497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 54996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (outputBufferFile1) 550061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fclose (outputBufferFile1); 5501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 5503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (outputExtradataFile); 5504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 55058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec::component_deinit() complete"); 550661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 551061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 551161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseEGLImage 5512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 551361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 551461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use EGL Image method implementation <TBD>. 5515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 551661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 551761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 551961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 552061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Not Implemented error. 5521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 552261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 552461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 552561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 552661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 552761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN void* eglImage) 5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 552961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list; 553061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry; 553161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info; 5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 553461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc; 553561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan EGLint fd = -1, offset = 0,pmemPtr = 0; 5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 553761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fd = -1, offset = 0; 5538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 55398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("use EGL image support for decoder"); 554061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) { 55418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR(""); 554261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 554461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_display_id == NULL) { 55458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Display ID is not set by IL client"); 5546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 554761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 554861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC) 554961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eglGetProcAddress("eglQueryImageKHR"); 555061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd); 555161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset); 555261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr); 5553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app 5554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl { 5555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int pmem_fd; 5556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int offset; 5557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }; 5558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl *temp_egl_id = NULL; 5559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void * pmemPtr = (void *) eglImage; 5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_egl_id = (struct temp_egl *)eglImage; 556161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_egl_id != NULL) { 5562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = temp_egl_id->pmem_fd; 5563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev offset = temp_egl_id->offset; 5564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (fd < 0) { 55678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd); 5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 556961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 557061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info.pmem_fd = (OMX_U32) fd; 557161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info.offset = (OMX_U32) offset; 557261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_entry.entry = (void *) &pmem_info; 557361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 557461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list.entryList = &pmem_entry; 557561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list.nEntries = 1; 557661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers = true; 557761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port, 557861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void *)&pmem_list, drv_ctx.op_buf.buffer_size, 557961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *)pmemPtr)) { 55808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("use buffer call failed for egl image"); 558161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 558261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 558361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 558761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 558861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentRoleEnum 5589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 559061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 559161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Component Role Enum method implementation. 5592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 559361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 559461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 559661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 559761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything is successful. 559861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 560061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_U8* role, 560161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 index) 5602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 560361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 5604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 560561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 560661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 560761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 56088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 560961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 561061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 561161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 561361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 561461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 561561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 56168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 561761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 561861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 561961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 562061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 562161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 562261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 56238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 562461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 562661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 562761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 563061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 563161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) ) { 563261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 563361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 56348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 563561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 563761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 563861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 563961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 564061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 564161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 56428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 564361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 564561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 564661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 564761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 564861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 564961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 56508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 565161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 565361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 565461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 565561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 565661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 565761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 565861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 565961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 56608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 566161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 566361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 566461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 566561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 566661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 566761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 56688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 566961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 567161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 567261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 567361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component"); 567561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 56766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 567761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 5678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 568461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 568561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateDone 5686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 568761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 568861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if entire buffer pool is allocated by IL Client or not. 568961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Need this to move to IDLE state. 5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 569261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 569561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void) 5699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 570061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 570161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet_In = false; 570261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet_Out = false; 5703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 570461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet_In = allocate_input_done(); 570561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet_Out = allocate_output_done(); 5706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 570761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bRet_In && bRet_Out) { 570861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 570961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 571161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 571461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 571561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateInputDone 5716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 571761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 571861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if I/P buffer pool is allocated by IL Client or not. 5719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 572061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 572161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 572361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 572461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 572661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void) 5728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 572961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 573061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0; 573161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 573261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr == NULL) { 573361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 573461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 573561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr ) { 573661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; i<drv_ctx.ip_buf.actualcount; i++) { 573761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 573861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 573961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == drv_ctx.ip_buf.actualcount) { 574361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 574461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 574561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) { 574761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated = OMX_TRUE; 574861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 575261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 575361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateOutputDone 5754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 575561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 575661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if entire O/P buffer pool is allocated by IL Client or not. 5757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 575861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 575961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 576161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 576261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 576461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void) 5766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 576761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 576861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned j=0; 576961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 577061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr == NULL) { 577161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 577261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 577361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 577461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 577561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j < drv_ctx.op_buf.actualcount; j++) { 577661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,j)) { 577761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 577861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 577961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 578061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 578161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 578261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j == drv_ctx.op_buf.actualcount) { 578361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 578461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 578561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_bEnabled) 578661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bPopulated = OMX_TRUE; 578761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 578961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 579361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 579461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseDone 5795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 579661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 579761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 579961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 580061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 580361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void) 5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 580861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 5809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 581061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_input_done()) { 581161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 581261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 581361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 581561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 582061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 582161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseOutputDone 5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 582361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 582461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 582661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 582761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 582961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 583061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void) 5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 583561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 583661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0,j=0; 583761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p",m_inp_mem_ptr); 583961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 584061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j < drv_ctx.op_buf.actualcount ; j++) { 584161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_out_bm_count,j)) { 584261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 584361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 584461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 584561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j == drv_ctx.op_buf.actualcount) { 584661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count = 0; 584761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 584861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 584961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 585061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count = 0; 585161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 585261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 585361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 585661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 585761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseInputDone 5858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 585961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 586061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 586261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 586361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 586561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 586661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 586861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void) 5870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 587161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 587261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0,j=0; 587361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 587561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) { 587661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j<drv_ctx.ip_buf.actualcount; j++) { 587761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( BITMASK_PRESENT(&m_inp_bm_count,j)) { 587861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 587961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 588061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 588161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j==drv_ctx.ip_buf.actualcount) { 588261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 588361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 588461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 588561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 588661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 588761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp, 589161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE * buffer) 5892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 589361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 589461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) { 58958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer); 589661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 589761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (output_flush_progress) { 589861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 589961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 590061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp = 0; 590161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 590261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 590361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 590461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 59068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 590761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer); 590861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers --; 5909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 591061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 59118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Output EOS has been reached"); 591261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!output_flush_progress) 591361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event((unsigned)NULL, (unsigned)NULL, 591461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EOS_DONE); 5915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 591661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame) { 591761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 591861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 591961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 592061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 592161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 592261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL, 592361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL); 592461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 592561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 592661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 592761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 59288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("In fill Buffer done call address %p ",buffer); 592961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_BUFFER_LOG 593061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputBufferFile1 && buffer->nFilledLen) { 593161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int buf_index = buffer - m_out_mem_ptr; 593261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int stride = drv_ctx.video_resolution.stride; 593361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int scanlines = drv_ctx.video_resolution.scan_lines; 593461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; 593561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i; 593661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bytes_written = 0; 593761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) { 593861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1); 593961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp += stride; 594061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 594161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines; 594261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int stride_c = stride; 594361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) { 594461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1); 594561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp += stride_c; 594661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 594761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 594961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 595061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* For use buffer we need to copy the data */ 595161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!output_flush_progress) { 595261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.get_next_timestamp(buffer, 595361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 595461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 595561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 595661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 595761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_TICKS expected_ts = 0; 595861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.pop_min_ts(expected_ts); 59598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list", 596061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp, expected_ts); 596161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 596261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nTimeStamp != expected_ts) { 59638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check"); 596461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 596561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 596661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 596861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_cb.FillBufferDone) { 596961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen > 0) { 597061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle_extradata(buffer); 597161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) 597261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep min timestamp interval to handle corrupted bit stream scenario 597361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(buffer->nTimeStamp); 597461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (arbitrary_bytes) 597561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan adjust_timestamp(buffer->nTimeStamp); 597661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 597761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!proc_frms) { 597861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.stop(); 597961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan latency = dec_time.processing_time_us() - latency; 598061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3); 598161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 598261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fps_metrics.start(); 598361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 598461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms++; 598561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 598661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U64 proc_time = 0; 598761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fps_metrics.stop(); 598861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_time = fps_metrics.processing_time_us(); 598961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)", 599061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms, (float)proc_time / 1e6, 599161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)(1e6 * proc_frms) / proc_time); 599261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms = 0; 599361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 599461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 599561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 599661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_EXTRADATA_LOG 599761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputExtradataFile) { 599861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 599961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 600061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) 600161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned)(buffer->pBuffer + buffer->nOffset + 600261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen + 3)&(~3)); 600361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (p_extra && 600461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) { 60058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType); 600661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fwrite (p_extra,1,p_extra->nSize,outputExtradataFile); 600761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p_extra->eType == OMX_ExtraDataNone) { 600861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 600961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 601061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 601161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 601261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 601361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 601461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 601561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 601661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 601761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 601861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 601961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 602061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 602161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((OMX_QCOM_PLATFORM_PRIVATE_LIST *) 602261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->pPlatformPrivate)->entryList->entry; 60238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd); 602461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *il_buffer; 602561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan il_buffer = client_buffers.get_il_buf_hdr(buffer); 602661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (il_buffer) 602761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,il_buffer); 602861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 602961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr"); 603061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 603161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 60328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd); 603361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 603461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 60356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 6036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 603761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp, 604161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* buffer) 6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 604461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) { 60458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer); 604661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 60498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 605061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer); 6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_input_buffers--; 6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 605361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 605461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL && input_flush_progress == false) { 60558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer); 605661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = buffer; 605761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 605861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp = LLONG_MAX; 605961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan push_input_buffer (hComp); 606061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 60618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer); 606261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 606361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)buffer, 606461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 60658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error"); 606661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 606861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_cb.EmptyBufferDone) { 6069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 607061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 6072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 6074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message) 6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 608061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec* omx = NULL; 608161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo *vdec_msg = NULL; 608261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omxhdr = NULL; 608361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer *v4l2_buf_ptr = NULL; 608461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *output_respbuf = NULL; 608561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc=1; 608661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (context == NULL || message == NULL) { 60878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check"); 608861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 608961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 609061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg = (struct vdec_msginfo *)message; 609161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 609261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = reinterpret_cast<omx_vdec*>(context); 609361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 609461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (vdec_msg->msgcode) { 609561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 609661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_HW_ERROR: 609761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 609861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 609961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 610061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 610161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_START_DONE: 610261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 610361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_START_DONE); 610461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 610561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 610661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_STOP_DONE: 610761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 610861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 610961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 611061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 611161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_RESUME_DONE: 611261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 611361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_RESUME_DONE); 611461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 611561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 611661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_PAUSE_DONE: 611761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 611861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PAUSE_DONE); 611961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 612061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 612161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 612261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 612361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 612461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 612561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 612661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 612761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 612861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 612961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_FLUSHED: 613061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 613161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 613261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* omxhdr = (OMX_BUFFERHEADERTYPE* ) 613361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.input_frame_clientdata; */ 613461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 613561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata; 613661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index; 613761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr == NULL || 613861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) { 613961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr = NULL; 614061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->status_code = VDEC_S_EFATAL; 614161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 614261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 614361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code, 614461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 614561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 614661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_INFO_FIELD_DROPPED: 614761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int64_t *timestamp; 614861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan timestamp = (int64_t *) malloc(sizeof(int64_t)); 614961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (timestamp) { 615061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *timestamp = vdec_msg->msgdata.output_frame.time_stamp; 615161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)timestamp, vdec_msg->status_code, 615261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED); 61538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Field dropped time stamp is %lld", 615461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.time_stamp); 615561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 615661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 615761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_FLUSHED: 615861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 615961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 616061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data; 616161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index; 616261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)", 616361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr, vdec_msg->msgdata.output_frame.time_stamp, 616461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.pic_type); 616561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 616661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr && omxhdr->pOutputPortPrivate && 616761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) && 616861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate 616961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) { 617061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) { 617161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len; 617261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset; 617361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp; 617461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags; 617561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 61768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) { 617761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_EOS; 617861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //rc = -1; 617961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 618061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) { 618161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 618261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 618361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.bufferaddr = 618461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr; 618561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft != 618661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.framesize.left) 618761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top) 618861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right) 618961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) { 619061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left; 619161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top; 619261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right; 619361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom; 61948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Crop information has changed"); 619561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop, 619661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PORT_RECONFIG); 619761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 619861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf = (struct vdec_output_frameinfo *)\ 619961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->pOutputPortPrivate; 620061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->len = vdec_msg->msgdata.output_frame.len; 620161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->offset = vdec_msg->msgdata.output_frame.offset; 620261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) { 620361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_I; 620461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 620561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) { 620661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_P; 620761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 620861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) { 620961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_B; 621061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 621161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 621261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->output_use_buffer) 621361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ( omxhdr->pBuffer, (void *) 621461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr + 621561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)vdec_msg->msgdata.output_frame.offset), 621661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.len); 621761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 621861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFilledLen = 0; 621961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code, 622061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_FBD); 622161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) 622261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 622361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EOS_DONE); 622461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 622561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 622661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 622761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 622861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_CONFIG_CHANGED: 62298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Port settings changed"); 623061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition, 623161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PORT_RECONFIG); 623261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 623361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_INFO_CONFIG_CHANGED: 623461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 62358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Port settings changed info"); 623661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // get_buffer_req and populate port defn structure 623761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 623861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 623961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret; 624061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 624161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 624261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height); 624361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline; 624461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.scan_lines = fmt.fmt.pix_mp.plane_fmt[0].reserved[0]; 624561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->m_port_def.nPortIndex = 1; 624661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->update_portdef(&(omx->m_port_def)); 624761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 624861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG); 624961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 625061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 625161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 625261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 625361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 625461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 6255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary ( 625861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_HANDLETYPE hComp, 625961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer 626061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 6261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 626261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 62638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Empty this arbitrary"); 626461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 626561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL) { 626661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 626761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 62688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 62698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %d, timestamp %u", 627061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp); 627161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 627261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return zero length and not an EOS buffer */ 627361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return buffer if input flush in progress */ 627461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) && 627561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) { 62768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress"); 627761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,buffer); 627861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 627961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 628061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 628161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame == NULL) { 62828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp); 628361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = buffer; 62848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Try to Push One Input Buffer "); 628561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan push_input_buffer (hComp); 628661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 62878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer); 628861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL, 628961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL)) { 629061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 629161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 629261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 629361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 629461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp) 6299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 630061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 630161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 630261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 630361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL || psource_frame == NULL) { 630461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we have a destination buffer*/ 630561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL) { 63068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get a Destination buffer from the queue"); 630761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 630861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 630961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *)address; 631061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 631161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 63128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame); 631361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 631461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 631561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 631661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we have a destination buffer*/ 631761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame == NULL) { 63188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get a source buffer from the queue"); 631961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 632061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 632161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *)address; 63228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame, 632361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nTimeStamp); 63248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d length %d", 632561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 632661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 632761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 632861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 632961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 633061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 633161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 633261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while ((pdest_frame != NULL) && (psource_frame != NULL)) { 633361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (codec_type_parse) { 633461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_MPEG4: 633561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_H263: 633661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_MPEG2: 633761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_sc_codec(hComp); 633861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 633961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_H264: 634061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_h264(hComp); 634161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 634261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_HEVC: 634361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_hevc(hComp); 634461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 634561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_VC1: 634661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_vc1(hComp); 634761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 634861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 634961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 635061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 635161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret != OMX_ErrorNone) { 63528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pushing input Buffer Failed"); 635361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 635461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 635561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 635661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 635761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 635861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 6359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp) 6362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 636361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 636461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 636561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 6366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 63678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %d", 636861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame,psource_frame->nTimeStamp); 636961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 637061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,&partial_frame) == -1) { 63718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 637261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 637461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 637561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 63768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame size %d source %p frame count %d", 637761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,psource_frame,frame_count); 637861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 637961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 63808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("TimeStamp updated %d",pdest_frame->nTimeStamp); 638161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*First Parsed buffer will have only header Hence skip*/ 638261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frame_count == 0) { 63838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame "); 638461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 638561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_MPEG4 || 638661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse == CODEC_TYPE_DIVX) { 638761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4StreamType psBits; 638861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset; 638961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.numBytes = pdest_frame->nFilledLen; 639061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4_headerparser.parseHeader(&psBits); 639161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 639261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 639361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 639461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 639561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 639661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen) { 639761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 639861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 639961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 640061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 640161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 640261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 640361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 640461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 640561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 640661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 640761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 640861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 640961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) { 64108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Zero len buffer return back to POOL"); 641161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL, 641261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL); 641361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 641461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 641561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 641661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 64178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a Complete Frame %d",pdest_frame->nFilledLen); 641861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 641961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nAllocLen == 642061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen + pdest_frame->nOffset) { 64218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled"); 642261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 642361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 642461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 642561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 642661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen == 0) { 642761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 642861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 642961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags |= psource_frame->nFlags; 64308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x", 643161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 64328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a frame size = %d number = %d", 643361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,frame_count++); 643461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 643661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 643761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 643861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 643961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 644061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 64418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr") ; 644261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 644361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 644461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 644561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd) { 64468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame); 644761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 644861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 644961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 645061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 64518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 645261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 645361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 64548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame, 645561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nTimeStamp); 64568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d length %d", 645761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 645861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 645961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 646061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 646161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp) 6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 646661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 646761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 646861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL isNewFrame = OMX_FALSE; 646961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 647061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 647161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 64728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated"); 647361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 64758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %d " 647661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal); 64778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 647861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen && look_ahead_nal) { 647961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 648061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 648161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 6482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 6483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer,h264_scratch.nFilledLen); 6484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += h264_scratch.nFilledLen; 64858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame"); 6486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 648761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 64888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264"); 6489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 649161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 649261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length == 0) { 64938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Zero NAL, hence parse using start code"); 649461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 649561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 64968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 6497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 649961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length); 650161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_h264_nallength(psource_frame, 650261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 65038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 650461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 650661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 650861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 650961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 65108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 651161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 651261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 651361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFlags = psource_frame->nFlags; 651461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen); 651661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen) { 651761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen, 651861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NALU_TYPE_SPS); 6519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 652061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) 652161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 652261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, NALU_TYPE_SEI); 652361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 652461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // If timeinfo is present frame info from SEI is already processed 652561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 652661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, NALU_TYPE_SEI); 652761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 652861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 652961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 653061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) { 653161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_last_au_ts; 653261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_last_au_flags; 653361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef PANSCAN_HDLR 653461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 653561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->update_panscan_data(h264_last_au_ts); 653661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 653761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 653861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR || 653961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) { 654061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = h264_scratch.nTimeStamp; 654161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = h264_scratch.nFlags; 654261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 654361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 654461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts); 654561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!VALID_TS(h264_last_au_ts)) 654661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = ts_in_sei; 654761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 654861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 654961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 655061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 655161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 655261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 655361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!isNewFrame) { 655461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 655561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 65568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %d", 655761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen); 655861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 655961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 656061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 656161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ) 656261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 656361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 656461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264"); 656661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 656761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 656861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 656961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = true; 65708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x", 657161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 65728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a frame size = %d number = %d", 657361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,frame_count++); 657461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 657561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen == 0) { 65768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Copy the Current Frame since and push it"); 657761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 657861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 657961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 658061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 658161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 658261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 658361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 658461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264"); 658661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 658761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 658861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 658961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 65908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Reset the EOS Flag"); 659161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 659261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 659361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 659461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 659561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 659661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 659761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //frame_count++; 659861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 659961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 660061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 660161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 66028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame); 660361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 660461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = 0; 660561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 660661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 660761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 660861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 660961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 661061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 661261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 661361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nAllocLen == 661461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen + h264_scratch.nOffset) { 66158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 661661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 6617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 661861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 661961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 662061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!psource_frame->nFilledLen) { 66218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame); 662261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 662361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 662461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 66258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 662661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 662761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 662861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 662961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 663061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 663161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 663261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264"); 663461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 663561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 663661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 663761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 663861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%d TimeStamp = %x", 664061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 66418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++); 664261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 664361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 664461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp); 664561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!VALID_TS(pdest_frame->nTimeStamp)) 664661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = ts_in_sei; 664761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 664961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 665061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 665161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 665261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 665361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 665461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 665561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d", 665761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,h264_scratch.nFilledLen); 665861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 665961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 666061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 666161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 666261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd && !psource_frame->nFilledLen) { 666361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 666461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 666561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 66668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 666761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 666861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 66698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d src length %d", 667061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 667161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 667261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 667361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66766eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc) 6677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 66786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_ERRORTYPE rc = OMX_ErrorNone; 667961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) { 66806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memcpy ((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen); 66818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (pDst->nTimeStamp == LLONG_MAX) { 66826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pDst->nTimeStamp = pSrc->nTimeStamp; 66836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_LOW("Assign Dst nTimeStamp=%lld", pDst->nTimeStamp); 6684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 66856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pDst->nFilledLen += pSrc->nFilledLen; 66866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pSrc->nFilledLen = 0; 668761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Destination buffer overflow"); 66896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rc = OMX_ErrorBadParameter; 6690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 66916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return rc; 6692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66946eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_hevc (OMX_HANDLETYPE hComp) 6695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 669661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 669761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 669861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL isNewFrame = OMX_FALSE; 669961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 670061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE rc = OMX_ErrorNone; 670161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 670261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 67038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated"); 670461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 67056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 670661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 670761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("h264_scratch.nFilledLen %d has look_ahead_nal %d pdest_frame nFilledLen %d nTimeStamp %lld", 670961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 671061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 671161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen && look_ahead_nal) { 671261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 671361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 671461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // copy the lookahead buffer in the scratch 67156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rc = copy_buffer(pdest_frame, &h264_scratch); 671661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc != OMX_ErrorNone) { 671761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 671861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 671961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 672061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length == 0) { 672161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 672261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 67238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 67246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 67256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 672661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length); 672861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_h264_nallength(psource_frame, 672961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 67308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 67316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 673261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 673361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 673461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 673561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 673661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 67378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 673861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 673961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 674061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFlags = psource_frame->nFlags; 674161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen); 674361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen) { 674461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame); 674561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 674661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 674761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 674861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!isNewFrame) { 67498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %d nTimestamp %lld, pdest_frame nFilledLen %d nTimestamp %lld", 675061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 675161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 675261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone) { 675361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 675461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 675561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 675661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = true; 675761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen == 0) { 675861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 67598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer"); 676061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 676161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone ) { 676261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 676361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 676461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 676561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 676661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 676761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 676861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %d nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %d nTimeStamp %lld", 677061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 677161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 677261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 677361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 677461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 677561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 677661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 677761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 67788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pop the next pdest_buffer %p",pdest_frame); 677961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 678061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = 0; 678161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 678261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 678361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 678461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 678561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 678661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %d nTimeStamp %lld, pdest_frame nFilledLen %d nTimeStamp %lld, h264_scratch nFilledLen %d nTimeStamp %lld", 678861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 678961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 679061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 679161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nAllocLen == 679261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen + h264_scratch.nOffset) { 67938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 679461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 679561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 679661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 679761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 679861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!psource_frame->nFilledLen) { 67998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame); 680061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 680161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 680261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 68038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 680461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 680561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone ) { 680661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 680761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 680861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 680961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 681061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 68118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%d TimeStamp = %lld", 681261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count, pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 681361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 681461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 681561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 681661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 681761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 681861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 681961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 682061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d", 682261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,h264_scratch.nFilledLen); 682361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 682461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 682561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 682661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 682761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd && !psource_frame->nFilledLen) { 682861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 682961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 683061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 683161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 683261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 68338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d nFilledLen %d, nTimeStamp %lld", 683461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp); 683561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 683661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 683761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 68386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 68396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68406eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp) 68416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 68426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U8 *buf, *pdest; 68436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U32 partial_frame = 1; 68446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U32 buf_len, dest_len; 68456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 684661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (first_frame == 0) { 68476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal first_frame = 1; 68488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes"); 684961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_vendor_config.pData) { 68508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Check profile type in 1st source buffer"); 68516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buf = psource_frame->pBuffer; 68526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buf_len = psource_frame->nFilledLen; 68536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) == 685561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE) { 68566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_vc1_profile = VC1_SP_MP_RCV; 685761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) { 68586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_vc1_profile = VC1_AP; 685961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer"); 68616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorStreamCorrupt; 68626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 686361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen + 68656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest_frame->nOffset; 68666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen + 686761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nOffset); 68686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 686961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dest_len < m_vendor_config.nDataSize) { 68708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Destination buffer full"); 68716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 687261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize); 68746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest_frame->nFilledLen += m_vendor_config.nDataSize; 68756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 687961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (m_vc1_profile) { 68806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case VC1_AP: 68818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code"); 688261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (push_input_sc_codec(hComp) != OMX_ErrorNone) { 68838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code"); 68846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 68856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 688661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 68876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case VC1_SP_MP_RCV: 68896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal default: 68908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode"); 68916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 68926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorNone; 68946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 68956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 689661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 689761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 alignment) 689861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 689961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct pmem_allocation allocation; 690061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.size = buffer_size; 690161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align = clip2(alignment); 690261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocation.align < 4096) { 690361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align = 4096; 690461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 690561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) { 69068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)", 690761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align, allocation.size); 690861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 690961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 691061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return true; 691161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 69126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 69136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size, 691461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 alignment, struct ion_allocation_data *alloc_data, 691561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_fd_data *fd_data, int flag) 69166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 691761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fd = -EINVAL; 691861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = -EINVAL; 691961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ion_dev_flag; 692061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ion ion_buf_info; 692161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!alloc_data || buffer_size <= 0 || !fd_data) { 69228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory"); 692361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -EINVAL; 692461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 692561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_dev_flag = O_RDONLY; 692661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = open (MEM_DEVICE, ion_dev_flag); 692761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 69288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd); 692961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return fd; 693061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 693161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags = 0; 693261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (flag & ION_FLAG_CACHED)) { 693361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags |= ION_FLAG_CACHED; 693461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 693561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->len = buffer_size; 693661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->align = clip2(alignment); 693761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (alloc_data->align < 4096) { 693861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->align = 4096; 693961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 694061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((secure_mode) && (flag & ION_SECURE)) 694161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags |= ION_SECURE; 694261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 694361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_ 69449157b7d2c90c853713840ce85a78f5d22600fe1ePraveen Chavan alloc_data->ION_HEAP_MASK = ION_HEAP(ION_ADSP_HEAP_ID); 694561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else 69469157b7d2c90c853713840ce85a78f5d22600fe1ePraveen Chavan alloc_data->ION_HEAP_MASK = ION_HEAP(ION_IOMMU_HEAP_ID); 694761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 694861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 69499157b7d2c90c853713840ce85a78f5d22600fe1ePraveen Chavan alloc_data->ION_HEAP_MASK = ION_HEAP(MEM_HEAP_ID); 695061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 695161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 695261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc || !alloc_data->handle) { 69538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION ALLOC memory failed "); 695461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->handle = NULL; 695561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(fd); 695661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = -ENOMEM; 695761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return fd; 695861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 695961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd_data->handle = alloc_data->handle; 696061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd,ION_IOC_MAP,fd_data); 696161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 69628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION MAP failed "); 696361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.ion_alloc_data = *alloc_data; 696461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.ion_device_fd = fd; 696561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.fd_ion_data = *fd_data; 696661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&ion_buf_info); 696761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd_data->fd =-1; 696861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = -ENOMEM; 696961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 697061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 6972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 697461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) 6975dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{ 697661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 697761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!buf_ion_info) { 69788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata"); 697961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 698061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 698161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 698261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &buf_ion_info->ion_alloc_data.handle)) { 69838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION: free failed" ); 698461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 698561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(buf_ion_info->ion_device_fd); 698661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->ion_device_fd = -1; 698761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->ion_alloc_data.handle = NULL; 698861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->fd_ion_data.fd = -1; 6989dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand} 6990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header() 6992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 69938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("ALL output buffers are freed/released"); 699461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_use_buffer = false; 699561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers = false; 699661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 699761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 699861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_out_mem_ptr); 699961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 700061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 700161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 700261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_platform_list) { 700361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_platform_list); 700461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = NULL; 700561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 700661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 700761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 700861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_respbuffer); 700961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 701061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 701161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 701261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_outputbuffer); 701361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 701461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 70178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 701861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 7019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 7020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header() 7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_use_buffer = false; 702761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 702861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) { 70298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free utils parser"); 703061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan delete (m_frame_parser.mutils); 703161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils = NULL; 703261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 703361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 703461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr) { 70358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input Heap Pointer"); 703661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_inp_heap_ptr); 703761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = NULL; 703861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 703961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 704061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) { 70418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input pmem header Pointer"); 704261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_phdr_pmem_ptr); 704361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = NULL; 704461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 704561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 704661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) { 70478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input pmem Pointer area"); 704861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_inp_mem_ptr); 704961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr = NULL; 705061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 705161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer) { 70528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Driver Context pointer"); 705361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_inputbuffer); 705461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer = NULL; 7055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ip_buf_ion_info) { 70588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ion context"); 705961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ip_buf_ion_info); 7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info = NULL; 7061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 70646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 70656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::stream_off(OMX_U32 port) 7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 706761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type btype; 706861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 706961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_ports v4l2_port = OUTPUT_PORT; 707061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 707161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 707261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 707361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_port = OUTPUT_PORT; 707461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 707561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 707661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_port = CAPTURE_PORT; 707761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_ALL) { 707861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX); 707961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 708061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 708161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!rc_input) 708261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc_input; 708361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 708461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc_output; 708561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 708661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 708761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!streaming[v4l2_port]) { 708861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // already streamed off, warn and move on 708961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port," 709061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " which is already streamed off", v4l2_port); 709161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 0; 709261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 709361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 709461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port); 709561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 709661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype); 709761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 709861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 70998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port); 710061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 710161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[v4l2_port] = false; 710261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 710361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 710461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 710561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 710661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 710761a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop) 710861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 710961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 711061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 711161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0; 711261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 711361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret = 0; 711461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 711561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 711661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = 1; 711761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 711861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 711961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 712061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 712161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 712261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 712361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 712461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 712561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 712661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 712761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 712861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet==OMX_ErrorNone) { 712961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 713061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 713161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 713261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 713361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 713461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 713561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 713661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 713761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount = bufreq.count; 713861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->mincount = bufreq.count; 71398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Count = %d",bufreq.count); 714061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 714161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)", 714261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type); 714361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 714461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 714561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 714661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 714761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 714861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 714961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height); 715061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 715161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes; 71528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage); 715361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 715461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 715561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 715661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 715761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 715861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 715961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 716061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 716161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = buffer_prop->buffer_size; 716261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 716361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 716461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 716561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 71668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 716761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 716861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 716961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_FRAMEINFO_EXTRADATA) { 717061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Frame info extra data enabled!"); 717161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE; 717261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 717361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_INTERLACE_EXTRADATA) { 717461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE; 717561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 717661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_PORTDEF_EXTRADATA) { 717761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE; 71788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d", 717961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size); 718061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 718161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extra_data_size) { 718261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator 718361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit 718461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 718561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size; 718661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.count = buffer_prop->actualcount; 718761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.buffer_size = extra_data_size; 718861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size += client_extra_data_size; 718961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 719061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)", 719161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type); 719261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (in_reconfig) // BufReq will be set to driver when port is disabled 719361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = buf_size; 719461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (buf_size != buffer_prop->buffer_size) { 719561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = buf_size; 719661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(buffer_prop); 719761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 719861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 71998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)", 720061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type); 720161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 720461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop) 720561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 720661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 720761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned buf_size = 0; 720861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 720961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 721061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret; 721161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)", 721261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size); 721361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 721461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_size != buffer_prop->buffer_size) { 721561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)", 721661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size, buf_size); 721761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 721861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 721961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 722061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 722161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 722261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 722361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 722461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 722561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 722661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 722761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 722861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 722961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 723061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 723161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 723261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 723361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 723461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 723561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret); 723661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 723761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 723861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 723961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 724061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = buffer_prop->actualcount; 724161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 724261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 724361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 724461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 724561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 724661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 724761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 724961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet==OMX_ErrorNone) { 725061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 725161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 725261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 725361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 725461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret); 725561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 725661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 725761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (bufreq.count < buffer_prop->actualcount) { 725861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Driver refused to change the number of buffers" 725961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " on v4l2 port %d to %d (prefers %d)", bufreq.type, 726061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, bufreq.count); 726161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 726261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 726361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.update_buffer_req()) { 726461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed"); 726561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 726661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 726761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 726861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 726961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!eRet && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 727061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // need to update extradata buffers also 727161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size; 727261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.count = buffer_prop->actualcount; 727361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 727461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7275dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand} 7276dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 7277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution() 7278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 727961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 728061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 7284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 728561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 728661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!portDefn) { 728761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 728861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 72898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("omx_vdec::update_portdef"); 729061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 729161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nSize = sizeof(portDefn); 729261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDomain = OMX_PortDomainVideo; 729361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator > 0) 729461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator / 729561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator; 729661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 72978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Divide by zero"); 729861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 7299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 730061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portDefn->nPortIndex) { 730161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirInput; 730261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 730361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 730461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 730561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused; 730661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eCompressionFormat = eCompressionFormat; 730761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bEnabled = m_inp_bEnabled; 730861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bPopulated = m_inp_bPopulated; 730961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (1 == portDefn->nPortIndex) { 731061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buf_size = 0; 731161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.update_buffer_req()) { 73128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed"); 731361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 731461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 731561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_buffer_req(buf_size)) { 73168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("update buffer requirements"); 731761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 731861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 731961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize = buf_size; 732061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirOutput; 732161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 732261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 732361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 732461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bEnabled = m_out_bEnabled; 732561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bPopulated = m_out_bPopulated; 732661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) { 73278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error in getting color format"); 732861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 732961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 733061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 733161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirMax; 733261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 733361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->nPortIndex); 733461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 733561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 733661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height; 733761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width; 733861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride = drv_ctx.video_resolution.stride; 733961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines; 734061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld" 73418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " SliceHeight = %lu", portDefn->format.video.nFrameWidth, 734261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight, 734361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride, 734461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight); 734561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers() 7350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 735161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 735261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr = NULL; 735361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; 735461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 735561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 73568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation"); 735761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nBufHdrSize = 0; 735861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformEntrySize = 0; 735961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformListSize = 0; 736061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPMEMInfoSize = 0; 736161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 736261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 736361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 736461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 73658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Setting First Output Buffer(%d)", 736661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 736761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufHdrSize = drv_ctx.op_buf.actualcount * 736861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE); 736961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 737061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize = drv_ctx.op_buf.actualcount * 737161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 737261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize = drv_ctx.op_buf.actualcount * 737361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 737461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformEntrySize = drv_ctx.op_buf.actualcount * 737561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 737661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 73778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize, 737861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE), 737961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize, 738061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize); 73818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PE %d bmSize %d",nPlatformEntrySize, 738261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count); 738361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 738461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Alloc mem for platform specific info 738561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *pPtr=NULL; 738661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 738761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize,1); 738861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \ 738961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_bufferpayload), 739061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 739161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 739261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo), 739361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 7394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 739561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \ 739661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount); 7397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 739961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 740061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_respbuffer) { 740161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr = m_out_mem_ptr; 740261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 740361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 740461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_list) + nPlatformListSize); 740561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 740661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_entry) + nPlatformEntrySize); 740761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList = m_platform_list; 740861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry = m_platform_entry; 740961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = m_pmem_info; 741061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 74118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 741261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 741361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Settting the entire storage nicely 74148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, 741561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr,pPlatformEntry); 74168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 741761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 741861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 741961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 742061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Set the values when we determine the right HxW param 742161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nAllocLen = 0; 742261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nFilledLen = 0; 742361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pAppPrivate = NULL; 742461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 742561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 742661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->entry = pPMEMInfo; 742761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform List 742861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->nEntries = 1; 742961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->entryList = pPlatformEntry; 743061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep pBuffer NULL till vdec is opened 743161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pBuffer = NULL; 743261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->offset = 0; 743361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->pmem_fd = 0; 743461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pPlatformPrivate = pPlatformList; 743561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 7436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 743761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 7438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 743961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create a mapping between buffers*/ 744061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 744161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 744261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ptr_outputbuffer[i]; 744361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the buffer and buffer header pointers 744461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr++; 744561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo++; 744661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry++; 744761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList++; 744861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 744961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 74508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 745161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr, pPtr); 745261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 745361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_out_mem_ptr); 745461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 745561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 745661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pPtr) { 745761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(pPtr); 745861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = NULL; 745961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 746061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 746161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_outputbuffer); 746261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 746361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 746461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 746561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_respbuffer); 746661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 746761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 746961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info) { 74708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 747161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 747261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = NULL; 747361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 747561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 747661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 747761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 747861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 7479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 748061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs() 7484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 748561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1; 748661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2; 748761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident; 748861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_cmd_queue tmp_q, pending_bd_q; 748961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 749061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // pop all pending GENERATE FDB from ftb queue 749161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_ftb_q.m_size) { 749261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.pop_entry(&p1,&p2,&ident); 749361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_FBD) { 749461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.insert_entry(p1,p2,ident); 749561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 749661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.insert_entry(p1,p2,ident); 749761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 749961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //return all non GENERATE FDB to ftb queue 750061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (tmp_q.m_size) { 750161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.pop_entry(&p1,&p2,&ident); 750261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.insert_entry(p1,p2,ident); 750361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 750461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // pop all pending GENERATE EDB from etb queue 750561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_etb_q.m_size) { 750661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 750761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_EBD) { 750861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.insert_entry(p1,p2,ident); 750961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 751061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.insert_entry(p1,p2,ident); 751161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 751261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 751361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //return all non GENERATE FDB to etb queue 751461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (tmp_q.m_size) { 751561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.pop_entry(&p1,&p2,&ident); 751661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.insert_entry(p1,p2,ident); 751761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 751861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 751961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // process all pending buffer dones 752061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (pending_bd_q.m_size) { 752161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.pop_entry(&p1,&p2,&ident); 752261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (ident) { 752361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EBD: 752461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 75258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!"); 752661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 752761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 752861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 752961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 753061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FBD: 753161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 75328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!"); 753361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 753461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 753561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 753661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp) 7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 754261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 new_frame_interval = 0; 754361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 754461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) { 754561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan new_frame_interval = (act_timestamp > prev_ts)? 754661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp - prev_ts : 754761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts - act_timestamp; 754861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (new_frame_interval < frm_int || frm_int == 0) { 754961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = new_frame_interval; 755061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frm_int) { 755161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 1e6; 755261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = frm_int; 755361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)", 755461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int, drv_ctx.frame_rate.fps_numerator / 755561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)drv_ctx.frame_rate.fps_denominator); 755661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 755761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 755861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 755961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 7560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp) 7563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 756461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rst_prev_ts && VALID_TS(act_timestamp)) { 756561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 756661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = false; 756761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (VALID_TS(prev_ts)) { 756861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool codec_cond = (drv_ctx.timestamp_adjust)? 756961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)? 757061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)): 757161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!VALID_TS(act_timestamp) || act_timestamp == prev_ts); 757261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frm_int > 0 && codec_cond) { 757361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 757461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp = prev_ts + frm_int; 757561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 757661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 757761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 757861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(act_timestamp); 757961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (frm_int > 0) // In this case the frame rate was set along 758061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { // with the port definition, start ts with 0 758161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 758261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 7583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 7587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 758861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL; 758961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_conceal_MB = 0; 759061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 frame_rate = 0; 759161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int consumed_len = 0; 759261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_MB_in_frame; 759361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 recovery_sei_flags = 1; 759461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int buf_index = p_buf_hdr - m_out_mem_ptr; 759561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_panscan_window_payload *panscan_payload = NULL; 759661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) + 759761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nOffset; 759861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.extradata_info.uaddr) { 759961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 760061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 760161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) 760261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3)); 760361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size; 760461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen)) 760561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = NULL; 760661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata; 760761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (data) { 760861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while ((consumed_len < drv_ctx.extradata_info.buffer_size) 76098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) { 761061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) { 761161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Invalid extra data size"); 761261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 761361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 761461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)data->eType) { 76158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO: 761661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_interlace_payload *payload; 761761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan payload = (struct msm_vidc_interlace_payload *)data->data; 76188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (payload->format != MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) { 761961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int enable = 1; 762061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 mbaff = 0; 762161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mbaff = (h264_parser)? (h264_parser->is_mbaff()): false; 76228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((payload->format == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) && !mbaff) 762361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 762461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 762561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 762661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) 762761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 762861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PP_PARAM_INTERLACED, (void*)&enable); 762961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 763061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) { 763161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_interlace_extradata(p_extra, payload->format); 763261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 763361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 763461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_FRAME_RATE: 763661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_framerate_payload *frame_rate_payload; 763761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data; 763861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_rate = frame_rate_payload->frame_rate; 763961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_TIMESTAMP: 764161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_ts_payload *time_stamp_payload; 764261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_payload = (struct msm_vidc_ts_payload *)data->data; 764361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo; 764461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32); 764561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB: 764761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_concealmb_payload *conceal_mb_payload; 764861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data; 764961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 765061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_height + 15)) >> 8; 765161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0); 765261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_ASPECT_RATIO: 765461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload; 765561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)data->data; 765661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((struct vdec_output_frameinfo *) 765761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width; 765861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((struct vdec_output_frameinfo *) 765961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height; 766061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI: 766261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_recoverysei_payload *recovery_sei_payload; 766361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data; 766461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan recovery_sei_flags = recovery_sei_payload->flags; 76658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) { 766661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 76678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received"); 766861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 766961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW: 767161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data; 767261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 767361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 767461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto unrecognized_extradata; 767561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 767661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan consumed_len += data->nSize; 767761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 767861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 767961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 768061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 768161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_frame_info_extradata(p_extra, 768261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate, 768361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_payload,&((struct vdec_output_frameinfo *) 768461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info); 768561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 768661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 76876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunrecognized_extradata: 768861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && client_extradata) 768961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_terminator_extradata(p_extra); 769061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 76936eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, 769461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool is_internal, bool enable) 7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 769661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 769761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 769861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state != OMX_StateLoaded) { 769961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 770061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 770161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 77028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d", 770361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata, requested_extradata, enable, is_internal); 770461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 770561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!is_internal) { 770661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enable) 770761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata |= requested_extradata; 770861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 770961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata = client_extradata & ~requested_extradata; 771061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 771161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 771261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enable) { 771361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (requested_extradata & OMX_INTERLACE_EXTRADATA) { 771461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 771561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO; 771661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 771761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set interlaced extradata." 77188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Quality of interlaced clips might be impacted."); 771961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 772061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) { 772161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 772261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE; 772361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set framerate extradata"); 772561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 772661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 772761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB; 772861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set concealed MB extradata"); 773061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 773161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 773261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI; 773361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata"); 773561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 773661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 773761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW; 773861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 774061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 774161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 77428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO; 774361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 774561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 774661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) { 774761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 774861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP; 774961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set timeinfo extradata"); 775161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 775261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 775361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 775461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = get_buffer_req(&drv_ctx.op_buf); 775561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 776061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0; 776161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *data_ptr = extra->data, data = 0; 776261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (byte_count < extra->nDataSize) { 776361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data = *data_ptr; 776461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (data) { 776561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB += (data&0x01); 776661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data >>= 1; 776761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 776861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data_ptr++; 776961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan byte_count++; 777061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 777161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 777261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_height + 15)) >> 8; 777361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0); 7774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 777861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_debug_extradata) 777961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 778261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "============== Extra Data ==============\n" 778361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Size: %lu \n" 778461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Version: %lu \n" 778561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " PortIndex: %lu \n" 778661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Type: %x \n" 77878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " DataSize: %lu", 778861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize, extra->nVersion.nVersion, 778961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex, extra->eType, extra->nDataSize); 779061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 779161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) { 779261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data; 779361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 779461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "------ Interlace Format ------\n" 779561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Size: %lu \n" 779661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Version: %lu \n" 779761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " PortIndex: %lu \n" 779861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Is Interlace Format: %d \n" 779961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Interlace Formats: %lu \n" 78008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "=========== End of Interlace ===========", 780161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex, 780261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan intfmt->bInterlaceFormat, intfmt->nInterlaceFormats); 780361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) { 780461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 780561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 780661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 780761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "-------- Frame Format --------\n" 780861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Picture Type: %d \n" 780961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Interlace Type: %d \n" 781061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Pan Scan Total Frame Num: %lu \n" 781161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Concealed Macro Blocks: %lu \n" 781261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " frame rate: %lu \n" 781361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Aspect Ratio X: %lu \n" 78148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Aspect Ratio Y: %lu", 781561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->ePicType, 781661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->interlaceType, 781761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->panScan.numWindows, 781861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->nConcealedMacroblocks, 781961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->nFrameRate, 782061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->aspectRatio.aspectRatioX, 782161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->aspectRatio.aspectRatioY); 782261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 782361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) { 782461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 782561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "------------------------------\n" 782661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Pan Scan Frame Num: %lu \n" 782761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Rectangle x: %ld \n" 782861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Rectangle y: %ld \n" 782961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Rectangle dx: %ld \n" 78308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Rectangle dy: %ld", 783161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y, 783261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy); 783361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 783461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 783561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("========= End of Frame Format =========="); 783661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra->eType == OMX_ExtraDataNone) { 783761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("========== End of Terminator ==========="); 783861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 783961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("======= End of Driver Extradata ========"); 784061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 784461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 interlaced_format_type) 7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 784661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STREAMINTERLACEFORMAT *interlace_format; 784761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 mbaff = 0; 784861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) { 784961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 785061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 785161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE; 785261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 785361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 785461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat; 785561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT); 785661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data; 785761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT); 785861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nVersion.nVersion = OMX_SPEC_VERSION; 785961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 786061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mbaff = (h264_parser)? (h264_parser->is_mbaff()): false; 78618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) && !mbaff) { 786261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->bInterlaceFormat = OMX_FALSE; 786361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 786461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 786561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 786661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->bInterlaceFormat = OMX_TRUE; 786761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; 786861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 786961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 787061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 78736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::fill_aspect_ratio_info( 787461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_aspectratioinfo *aspect_ratio_info, 787561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info) 78766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 787761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata = frame_info; 787861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width; 787961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height; 788061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX, 788161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioY); 78826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 7883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 788561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate, 78866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct msm_vidc_panscan_window_payload *panscan_payload, 78876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct vdec_aspectratioinfo *aspect_ratio_info) 7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 788961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL; 789061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_panscan_window *panscan_window; 789161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 78926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return; 789361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 789461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE; 789561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 789661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 789761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo; 789861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO); 789961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 790061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (picture_type) { 790161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_I: 790261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeI; 790361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 790461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_P: 790561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeP; 790661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 790761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_B: 790861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeB; 790961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 791061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 791161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0; 791261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 791361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 791461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 791561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 791661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 791761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 791861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive; 791961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio)); 792061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->nConcealedMacroblocks = num_conceal_mb; 792161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->nFrameRate = frame_rate; 792261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.numWindows = 0; 792361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (panscan_payload) { 792461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.numWindows = panscan_payload->num_panscan_windows; 792561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_window = &panscan_payload->wnd[0]; 792661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) { 792761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].x = panscan_window->panscan_window_width; 792861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].y = panscan_window->panscan_window_height; 792961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset; 793061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset; 793161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_window++; 793261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 793361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 793461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fill_aspect_ratio_info(aspect_ratio_info, frame_info); 793561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 794061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL; 794161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE; 794261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 794361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 794461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef; 794561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 794661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data; 794761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *portDefn = m_port_def; 794861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u" 79498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "sliceheight = %u",portDefn->format.video.nFrameHeight, 795061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth, 795161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride, 795261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight); 7953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 795761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_extradata) { 795861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 795961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 796061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE); 796161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 796261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = OMX_ExtraDataNone; 796361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = 0; 796461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->data[0] = 0; 796561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 796661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index) 7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 797161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 797261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= drv_ctx.ip_buf.actualcount) { 79738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found"); 797461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 797561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 797661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 797761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr = (desc_buffer_hdr*) \ 797861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(desc_buffer_hdr)), 797961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 798061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 79818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed "); 798261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 798361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 798461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 798561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 798661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8)); 798761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr[index].buf_addr == NULL) { 79888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("desc buffer Allocation failed "); 798961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 799061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 799161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 799261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset) 7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 799761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries); 799861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_demux_entries < 8192) { 799961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_offsets[m_demux_entries++] = address_offset; 800061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 800161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 8002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr) 8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 800661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 bytes_to_parse = buf_hdr->nFilledLen; 800761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset; 800861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 index = 0; 800961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 801061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 801161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 801261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (index < bytes_to_parse) { 801361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 801461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) || 801561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 801661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buf[index+2] == 0x01)) ) { 801761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Found start code, insert address offset 801861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan insert_demux_addr_offset(index); 801961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf[index+2] == 0x01) // 3 byte start code 802061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += 3; 802161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else //4 byte start code 802261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += 4; 802361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 802461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index++; 8025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 802661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries); 802761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 8028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr) 8031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 803261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //fix this, handle 3 byte start code, vc1 terminator entry 803361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *p_demux_data = NULL; 803461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 desc_data = 0; 803561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 start_addr = 0; 803661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 nal_size = 0; 803761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 suffix_byte = 0; 803861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 demux_index = 0; 803961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 buffer_index = 0; 804061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 804161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 804261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries."); 804361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 804461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 804561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 804661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 804761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_index > drv_ctx.ip_buf.actualcount) { 804861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index); 804961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 805061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 805161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 805261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr; 805361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 805461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( ((OMX_U8*)p_demux_data == NULL) || 805561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) { 805661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries."); 805761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 805861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 805961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; demux_index < m_demux_entries; demux_index++) { 806061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0; 806161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan start_addr = m_demux_offsets[demux_index]; 806261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) { 806361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3]; 806461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 806561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4]; 806661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 806761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (demux_index < (m_demux_entries - 1)) { 806861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2; 806961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 807061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2; 807161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 807261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)", 807361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan start_addr, 807461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte, 807561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size, 807661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan demux_index); 807761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = (start_addr >> 3) << 1; 807861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data |= (start_addr & 7) << 21; 807961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data |= suffix_byte << 24; 808061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 808161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 808261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32)); 808361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 808461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 808561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 808661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data += 16; 808761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 808861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_VC1) { 808961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("VC1 terminator entry"); 809061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0; 809161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0x82 << 24; 809261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 809361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 4, 0, sizeof(OMX_U32)); 809461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 809561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 809661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data += 16; 809761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries++; 809861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 809961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Add zero word to indicate end of descriptors 810061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data, 0, sizeof(OMX_U32)); 810161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 810261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32); 810361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size); 810461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 810561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 810661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 810761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Demux table complete!"); 810861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 8109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 81116eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::createDivxDrmContext() 8112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 811361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE err = OMX_ErrorNone; 811461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan iDivXDrmDecrypt = DivXDrmDecrypt::Create(); 811561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (iDivXDrmDecrypt) { 811661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE err = iDivXDrmDecrypt->Init(); 811761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (err!=OMX_ErrorNone) { 81188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR :iDivXDrmDecrypt->Init %d", err); 8119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete iDivXDrmDecrypt; 8120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt = NULL; 812161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 812261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 81238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unable to Create DIVX DRM"); 812461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan err = OMX_ErrorUndefined; 812561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 812661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return err; 8127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 81286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf() 81306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 813161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 813261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = NULL; 813361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_members(); 813461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat = OMX_COLOR_FormatMax; 81356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client) 81386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 813961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = reinterpret_cast<omx_vdec*>(client); 81406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 814261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members() 814361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 814461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count = 0; 814561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = 0; 814661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = 0; 814761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_platform_list_client,0,sizeof(m_platform_list_client)); 814861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_platform_entry_client,0,sizeof(m_platform_entry_client)); 814961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_pmem_info_client,0,sizeof(m_pmem_info_client)); 815061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client)); 81516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 815261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(op_buf_ion_info,0,sizeof(m_platform_entry_client)); 81536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 815461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (int i = 0; i < MAX_COUNT; i++) 815561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[i] = -1; 81566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 815861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() 815961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 816061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 81616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::update_buffer_req() 81646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 816561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 816661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int src_size = 0, destination_size = 0; 816761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE drv_color_format; 816861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 81698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid client in color convert"); 817061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 817161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 817261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 81738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("No color conversion required"); 817461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 817561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 817661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 817761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 && 817861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat != OMX_COLOR_FormatYUV420Planar) { 81798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion"); 818061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 818161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto fail_update_buf_req; 818261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 818361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 818461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.open(omx->drv_ctx.video_resolution.frame_height, 818561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.frame_width, 818661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NV12_128m,YCbCr420P); 818761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) { 818861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.get_buffer_size(C2D_INPUT,src_size); 818961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) 819061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.get_buffer_size(C2D_OUTPUT,destination_size); 819161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 819261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) { 819361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size || 819461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !destination_size) { 81958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d" 819661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "driver size %d destination size %d", 819761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan src_size,omx->drv_ctx.op_buf.buffer_size,destination_size); 819861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 819961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 820061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = 0; 820161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 820261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = destination_size; 820361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size) 820461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = omx->drv_ctx.op_buf.buffer_size; 820561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 820661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 820761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 82086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 82096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_update_buf_req: 821061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 821161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 82126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 82146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::set_color_format( 821561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE dest_color_format) 82166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 821761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 821861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE drv_color_format; 821961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 82208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid client in color convert"); 822161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 822261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 822361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 822461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 822561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_color_format = (OMX_COLOR_FORMATTYPE) 822661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 822761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 82288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Incorrect color format"); 82296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal status = false; 82306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 823161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status && (drv_color_format != dest_color_format)) { 82328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Enabling C2D"); 823361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dest_color_format != OMX_COLOR_FormatYUV420Planar) { 82348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unsupported color format for c2d"); 823561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 823661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 823761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat = OMX_COLOR_FormatYUV420Planar; 823861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled) 823961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 824061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 824161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!c2d.init()) { 82428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for c2d"); 824361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 824461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 824561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = true; 824661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 824761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 824861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled) 824961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 825061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 825161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 825261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 825361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 82546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 82566eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr() 82576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 825861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 82598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 826061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 826161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 826261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 826361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->m_out_mem_ptr; 826461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return m_out_mem_ptr_client; 82656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 826761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr 826861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd) 82696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 827061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 82718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 827261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 827361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 827461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 827561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bufadd; 827661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 827761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned index = 0; 827861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufadd - omx->m_out_mem_ptr; 827961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < omx->drv_ctx.op_buf.actualcount) { 828061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS); 828161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp; 828261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status; 828361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) { 828461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 828561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd, 828661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index], 828761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[index], pmem_baseaddress[index]); 828861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 828961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = buffer_size_req; 829061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!status) { 82918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed color conversion %d", status); 829261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = 0; 829361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return &m_out_mem_ptr_client[index]; 829461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 829561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 829661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = 0; 82976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return &m_out_mem_ptr_client[index]; 829861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 82998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr"); 830061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 83016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 83026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 830361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr 830461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd) 83056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 830661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 83078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 830861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 830961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 831061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 831161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bufadd; 831261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned index = 0; 831361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufadd - m_out_mem_ptr_client; 831461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < omx->drv_ctx.op_buf.actualcount) { 831561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return &omx->m_out_mem_ptr[index]; 831661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr"); 83186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return NULL; 83196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 832061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool omx_vdec::allocate_color_convert_buf::get_buffer_req 832161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(unsigned int &buffer_size) 83226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 832361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 832461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 832561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 832661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size = omx->drv_ctx.op_buf.buffer_size; 832761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 832861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) { 83298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get buffer size failed"); 833061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 833161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto fail_get_buffer_size; 833261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 833361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 833461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_size < omx->drv_ctx.op_buf.buffer_size) 83356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buffer_size = omx->drv_ctx.op_buf.buffer_size; 833661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 833761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 83386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_get_buffer_size: 833961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 834061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 83416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 83426eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer( 834361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufhdr) 834461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 834561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 834661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 834761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 834861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->free_output_buffer(bufhdr); 834961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled && omx->is_component_secure()) 835061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 835161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!allocated_count || !bufhdr) { 83528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr); 835361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 835461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 835561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufhdr - m_out_mem_ptr_client; 835661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= omx->drv_ctx.op_buf.actualcount) { 83578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer"); 835861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 835961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 836061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd[index] > 0) { 836161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap(pmem_baseaddress[index], buffer_size_req); 836261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd[index]); 836361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 836461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[index] = -1; 83656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 836661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->free_ion_memory(&op_buf_ion_info[index]); 8367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 836861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr[index].video_heap_ptr = NULL; 836961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocated_count > 0) 837061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count--; 837161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 837261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count = 0; 837361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!allocated_count) { 837461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 837561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 837661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_members(); 837761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 837861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 837961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->free_output_buffer(&omx->m_out_mem_ptr[index]); 83806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 8381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 83826eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 838361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes) 83846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 838561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 838661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 838761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 838861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 838961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 839061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled && omx->is_component_secure()) { 83918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d", 839261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->is_component_secure()); 839361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUnsupportedSetting; 839461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 839561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!bufferHdr || bytes > buffer_size_req) { 83968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr); 83978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("color_convert buffer_size_req %d bytes %lu", 839861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req,bytes); 839961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 840061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 840161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocated_count >= omx->drv_ctx.op_buf.actualcount) { 84028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert"); 840361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 840461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 840561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL; 840661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr, 840761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan port,appData,omx->drv_ctx.op_buf.buffer_size); 840861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone || !temp_bufferHdr) { 84098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Buffer allocation failed color_convert"); 841061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 841161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 841261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((temp_bufferHdr - omx->m_out_mem_ptr) >= 841361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.op_buf.actualcount) { 84148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid header index %d", 841561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (temp_bufferHdr - omx->m_out_mem_ptr)); 841661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUndefined; 841761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 841861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int i = allocated_count; 84196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 842061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory( 842161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req,buffer_alignment_req, 842261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data, 842361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 0); 842461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd; 842561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (op_buf_ion_info[i].ion_device_fd < 0) { 84268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert"); 842761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 842861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 842961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req, 843061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0); 843161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 843261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_baseaddress[i] == MAP_FAILED) { 84338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req); 843461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd[i]); 843561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->free_ion_memory(&op_buf_ion_info[i]); 843661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 843761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 843861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr[i].video_heap_ptr = new VideoHeap ( 843961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_buf_ion_info[i].ion_device_fd,buffer_size_req, 844061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]); 84416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 844261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get(); 844361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info_client[i].offset = 0; 844461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i]; 844561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 844661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list_client[i].nEntries = 1; 844761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list_client[i].entryList = &m_platform_entry_client[i]; 844861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pOutputPortPrivate = NULL; 844961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nAllocLen = buffer_size_req; 845061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nFilledLen = 0; 845161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nFlags = 0; 845261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 845361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE); 845461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION; 845561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i]; 845661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i]; 845761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pAppPrivate = appData; 845861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = &m_out_mem_ptr_client[i]; 84598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("IL client buffer header %p", *bufferHdr); 846061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count++; 846161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 84626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 84636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 84646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::is_component_secure() 84656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 846661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return secure_mode; 84676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 84686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 84696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format) 84706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 847161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 847261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 847361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 847461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dest_color_format = (OMX_COLOR_FORMATTYPE) 847561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 847661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 847761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 847861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 847961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ColorFormat != OMX_COLOR_FormatYUV420Planar) { 848061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 848161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 848261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dest_color_format = OMX_COLOR_FormatYUV420Planar; 848361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 848461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 84856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 8486