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 139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input) 140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer; 14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct pollfd pfd; 14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer v4l2_buf; 14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event dqevent; 14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec *omx = reinterpret_cast<omx_vdec*>(input); 14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pfd.fd = omx->drv_ctx.video_driver_fd; 15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0; 1518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: Async thread start"); 15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0); 15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = poll(&pfd, 1, POLL_TIMEOUT); 15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!rc) { 1568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Poll timedout"); 15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (rc < 0) { 1598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error while polling: %d", rc); 16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) { 16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.memory = V4L2_MEMORY_USERPTR; 16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.length = omx->drv_ctx.num_planes; 16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.m.planes = plane; 16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) { 16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.len=plane[0].bytesused; 17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr; 17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) + 17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (uint64_t)v4l2_buf.timestamp.tv_usec; 17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (vdec_msg.msgdata.output_frame.len) { 17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2]; 17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3]; 17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4]; 18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5]; 18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 1838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) { 18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.memory = V4L2_MEMORY_USERPTR; 19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.length = 1; 19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.m.planes = plane; 19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) { 19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE; 19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 1998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pfd.revents & POLLPRI) { 20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent); 20661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) { 20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED; 20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved"); 21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT ) { 21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 21761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_INFO_CONFIG_CHANGED; 21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved"); 22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) { 22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE; 22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Flush Done Recieved"); 22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 23161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 23261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 23361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE; 23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Flush Done Recieved"); 23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 23961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) { 2418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Close Done Recieved and async_message_thread Exited"); 24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 24361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) { 24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR; 24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("SYS Error Recieved"); 24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 2538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Some Event recieved"); 25461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan continue; 25561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: Async thread stop"); 25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input) 263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 26461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec* omx = reinterpret_cast<omx_vdec*>(input); 26561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char id; 26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int n; 26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx == NULL) { 2688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("message thread null pointer rxd"); 26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 27061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: message thread start"); 27361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0); 27461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan n = read(omx->m_pipe_in, &id, 1); 277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == n) { 27961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 28261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (1 == n) { 28361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->process_event_cb(omx, id); 28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 28561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((n < 0) && (errno != EINTR)) { 2868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno); 28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 28861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: message thread stop"); 29161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id) 295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 29661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret_value; 2976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 29861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx == NULL) { 2998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("message thread null pointer rxd"); 30061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 30161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out); 30361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret_value = write(omx->m_pipe_out, &id, 1); 3048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value); 305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor 308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue() 309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 31061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Nothing to do 311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor 314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memset(m_q,0,sizeof(m_q)); 317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert 320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id) 321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) { 32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].id = id; 32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].param1 = p1; 32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].param2 = p2; 32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_write++; 32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_size ++; 32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) { 33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_write = 0; 33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 33361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 3348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__); 33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop 340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id) 341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_size > 0) { 34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *id = m_q[m_read].id; 34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *p1 = m_q[m_read].param1; 34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *p2 = m_q[m_read].param2; 34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the read pointer ahead 34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ++m_read; 34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan --m_size; 35061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) { 35161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_read = 0; 35261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 35361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 35461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 35561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 35661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue 360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type() 361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return m_q[m_read].id; 363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list() 367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 36861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //initialize timestamps array 36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) ); 370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list() 372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //free m_ts_arr_list? 374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts) 377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool duplicate_ts = false; 38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //insert at the first available empty location 38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_ts_arr_list[idx].valid) { 38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //found invalid or empty entry, save timestamp 38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].valid = true; 38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].timestamp = ts; 38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts, idx); 39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) { 39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int min_idx = -1; 40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_TICKS min_ts = 0; 40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_ts_arr_list[idx].valid) { 41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //found valid entry, save index 41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (min_idx < 0) { 41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //first valid entry 41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_ts = m_ts_arr_list[idx].timestamp; 41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_idx = idx; 41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_ts_arr_list[idx].timestamp < min_ts) { 41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_ts = m_ts_arr_list[idx].timestamp; 41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_idx = idx; 41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (min_idx < 0) { 42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //no valid entries found 42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts = 0; 42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts = m_ts_arr_list[min_idx].timestamp; 43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[min_idx].valid = false; 43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 43361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts, min_idx); 43461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 43561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list() 442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 44361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 44461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 44761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 44861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].valid = false; 44961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances 455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void) 456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 45761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return (new omx_vdec); 458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base, 463f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ion_user_handle_t handle, int ionMapfd) 464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 46561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd); 466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base) 469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // dup file descriptor, map once, use pmem 471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev init(dup(fd), base, size, 0 , MEM_DEVICE); 472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_ 475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 47761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::omx_vdec 478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 48061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Constructor 481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None 484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 48661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::omx_vdec(): m_error_propogated(false), 48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state(OMX_StateInvalid), 49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_app_data(NULL), 49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr(NULL), 49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr(NULL), 49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_err_count(0), 49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress (false), 49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress (false), 49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_use_buffer (false), 49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_use_buffer (false), 49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers(false), 49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem(OMX_FALSE), 50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_region_smi(OMX_FALSE), 50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_pvt_entry_pmem(OMX_FALSE), 50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers(0), 50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers(0), 50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count(0), 50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bm_count(0), 50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated(OMX_FALSE), 50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bPopulated(OMX_FALSE), 50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_flags(0), 509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr(NULL), 511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled(OMX_TRUE), 51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled(OMX_TRUE), 51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_in_alloc_cnt(0), 51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list(NULL), 51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry(NULL), 51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info(NULL), 51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes (true), 51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame (NULL), 52061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame (NULL), 52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr (NULL), 52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr(NULL), 52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_inp_bm_count (0), 52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse ((codec_type)0), 52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame_meta (true), 52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count (0), 52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count (0), 52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length(0), 52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal (false), 53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame(0), 53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_buffer(NULL), 53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame_size (0), 53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_device_file_ptr(NULL), 53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile((vc1_profile_type)0), 53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts(LLONG_MAX), 53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags(0), 53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts(LLONG_MAX), 53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts(true), 53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int(0), 54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan in_reconfig(false), 54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_display_id(NULL), 54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser(NULL), 54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata(0), 544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_enable_android_native_buffers(OMX_FALSE), 54661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_android_native_buffers(OMX_FALSE), 54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan iDivXDrmDecrypt(NULL), 548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr(NULL), 55061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan secure_mode(false) 551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Assumption is that , to begin with , we have all the frames with decoder */ 55361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("In OMX vdec Constructor"); 554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char property_value[PROPERTY_VALUE_MAX] = {0}; 5568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_get("vidc.debug.level", property_value, "1"); 5578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan debug_level = atoi(property_value); 5588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_value[0] = '\0'; 5598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.perf", property_value, "0"); 56161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan perf_flag = atoi(property_value); 56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 56361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag); 56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms = latency = 0; 56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.ts", property_value, "0"); 56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_timestamp = atoi(property_value); 57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp); 57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(true); 57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.enable_debug_print(true); 57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 57561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.concealedmb", property_value, "0"); 57861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_concealedmb = atoi(property_value); 57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb); 580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_cmp,0,sizeof(m_cmp)); 58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_cb,0,sizeof(m_cb)); 58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (&drv_ctx,0,sizeof(drv_ctx)); 58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE)); 58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (m_hwdevice_name,0,sizeof(m_hwdevice_name)); 58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, sizeof(m_demux_offsets) ); 58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 5896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_ 59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 5916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.timestamp_adjust = false; 59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = -1; 59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = NULL; 59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init(&m_lock, NULL); 59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init(&c_lock, NULL); 59861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_init(&m_cmd_lock,0,0); 59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = 60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[OUTPUT_PORT] = false; 601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char extradata_value[PROPERTY_VALUE_MAX] = {0}; 60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.extradata", extradata_value, "0"); 60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_extradata = atoi(extradata_value); 60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata); 606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 60761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB; 60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_buffers.set_vdec_client(this); 6096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 6106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 6116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = { 61261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_FLUSH_DONE, 61361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT, 61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT, 61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_CLOSE_DONE, 61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_SYS_ERROR 6176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}; 6186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 6196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd) 6206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 62161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event_subscription sub; 62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int array_sz = sizeof(event_type)/sizeof(int); 62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i,rc; 62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 6268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid input: %d", fd); 62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < array_sz; ++i) { 63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 6358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type); 63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 63761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < array_sz) { 64061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (--i; i >=0 ; i--) { 64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 64361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) 6458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 64661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 64761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNotImplemented; 64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 64961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd) 6546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 65561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event_subscription sub; 65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int array_sz = sizeof(event_type)/sizeof(int); 65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i,rc; 65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 6608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid input: %d", fd); 66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < array_sz; ++i) { 66561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 66861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 6698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 67161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 6746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 6756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 67761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 67861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::~omx_vdec 679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Destructor 682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None 685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec() 690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = NULL; 69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_decoder_cmd dec; 69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("In OMX vdec Destructor"); 69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_pipe_in) close(m_pipe_in); 69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_pipe_out) close(m_pipe_out); 69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_in = -1; 69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_out = -1; 69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_join(msg_thread_id,NULL); 70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.cmd = V4L2_DEC_CMD_STOP; 70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 7038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("STOP Command failed"); 70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_join(async_thread_id,NULL); 70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsubscribe_to_events(drv_ctx.video_driver_fd); 70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&m_lock); 70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&c_lock); 71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_destroy(&m_cmd_lock); 71161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 71261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME"); 71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.end(); 71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Exit OMX vdec Destructor"); 716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 71861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type) 71961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = 0; 72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 7296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 7306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 73361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::OMXCntrlProcessMsgCb 734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL Client callbacks are generated through this routine. The decoder 73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan provides the thread context for this routine. 738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 74061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ctxt -- Context information related to the self. 74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id -- Event identifier. This could be any of the following: 74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1. Command completion event 74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2. Buffer done callback event 74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3. Frame done callback event 745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id) 751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 75261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan signed int p1; // Parameter - 1 75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan signed int p2; // Parameter - 2 75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int ident; 75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int qsize=0; // qsize 75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec *pThis = (omx_vdec *) ctxt; 75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis) { 7598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out", 76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan __func__); 76161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Protect the shared queue data structure 76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan do { 76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Read the message id's from the queue*/ 76761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&pThis->m_lock); 76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_cmd_q.m_size; 76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize == 0 && pThis->m_state != OMX_StatePause) { 77461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_ftb_q.m_size; 77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize == 0 && pThis->m_state != OMX_StatePause) { 78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_etb_q.m_size; 78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&pThis->m_lock); 78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*process message if we have one*/ 78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize > 0) { 79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id = ident; 79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (id) { 79261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT: 79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (p1) { 79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandStateSet: 79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = (OMX_STATETYPE) p2; 7978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d", 79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state); 79961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 80061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL); 80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_EventError: 80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_StateInvalid) { 8058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid"); 80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = (OMX_STATETYPE) p2; 80761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (p2 == OMX_ErrorHardware) { 81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error(); 81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 81361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventError, p2, (OMX_U32)NULL, NULL ); 81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandPortDisable: 8188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%d]", p2); 81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) { 82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT)) 8288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to release output buffers"); 82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf); 83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->in_reconfig = false; 83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error(); 83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandPortEnable: 8418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%d]", p2); 84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 8538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_ETB_ARBITRARY: 85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 8598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure"); 86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_ETB: 86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 8668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure"); 86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FTB: 87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 8748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure"); 87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_COMMAND: 88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U32)p2,(OMX_PTR)NULL); 88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EBD: 88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) { 8878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure"); 88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) { 89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_inp_err_count++; 89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->time_stamp_dts.remove_time_stamp( 89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp, 89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_inp_err_count = 0; 89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( pThis->empty_buffer_done(&pThis->m_cmp, 90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 9018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_buffer_done failure"); 90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) { 9058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR); 90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: 91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int64_t *timestamp = (int64_t *)p1; 91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p1) { 91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->time_stamp_dts.remove_time_stamp(*timestamp, 91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(timestamp); 91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FBD: 92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 9238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure"); 92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( pThis->fill_buffer_done(&pThis->m_cmp, 92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 9278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("fill_buffer_done failure"); 92861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 9338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Driver flush i/p Port complete"); 93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->input_flush_progress) { 9358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->execute_input_flush(); 93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 9408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 94261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we need generate event for Flush done*/ 94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_INPUT_FLUSH_PENDING)) { 94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 9478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Input Flush completed - Notify Client"); 94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandFlush, 95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX,NULL ); 95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_IDLE_PENDING)) { 95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) { 9558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port"); 95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->streaming[OUTPUT_PORT] = false; 95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->output_flush_progress) { 9618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Input flush done hence issue stop"); 96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 9748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Driver flush o/p Port complete"); 97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->output_flush_progress) { 9768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->execute_output_flush(); 97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 9818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we need generate event for Flush done*/ 98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) { 9878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Notify Output Flush done"); 98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandFlush, 99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 9958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Internal flush complete"); 99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) { 100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event(OMX_CommandPortDisable, 100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 100661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) { 101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 10118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port"); 101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 101361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->streaming[CAPTURE_PORT] = false; 101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->input_flush_progress) { 10178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Output flush done hence issue stop"); 101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 101961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_START_DONE: 10308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE"); 103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 103261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 10348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure"); 103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 10378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success"); 103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 10398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Move to executing"); 104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateExecuting; 104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 104561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateExecuting, NULL); 104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (BITMASK_PRESENT(&pThis->m_flags, 104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_PAUSE_PENDING)) { 104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (/*ioctl (pThis->drv_ctx.video_driver_fd, 104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) { 10508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed"); 105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 10568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Event Handler callback is NULL"); 105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_PAUSE_DONE: 10618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->complete_pending_buffer_done_cbs(); 106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) { 10698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Send the callback now 107161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StatePause; 107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StatePause, NULL); 107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_RESUME_DONE: 10858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 108761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 10888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 10928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Moving the decoder to execute state"); 109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateExecuting; 109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateExecuting,NULL); 109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_STOP_DONE: 11088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 11118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->complete_pending_buffer_done_cbs(); 111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) { 11168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success"); 111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateIdle; 11208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Move to Idle State"); 112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateIdle,NULL); 112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 11338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG"); 113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_IndexParamPortDefinition) { 113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->in_reconfig = true; 113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventPortSettingsChanged, p1, p2, NULL ); 114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) { 114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1; 114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged; 114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan format = OMX_InterlaceInterleaveFrameTopFieldFirst; 115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan format = OMX_InterlaceInterleaveFrameBottomFieldFirst; 115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else //unsupported interlace format; raise a error 115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan event = OMX_EventError; 115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan event, format, 0, NULL ); 115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EOS_DONE: 11648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->prev_ts = LLONG_MAX; 117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->rst_prev_ts = true; 117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 11768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 117861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG: 118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 11818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG"); 118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 118361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL ); 118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 118761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 119061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&pThis->m_lock); 119461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_cmd_q.m_size; 119561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_state != OMX_StatePause) 119661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 119761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&pThis->m_lock); 119861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } while (qsize>0); 1199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 12026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::update_resolution(int width, int height) 12036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 12046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.frame_height = height; 12056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.frame_width = width; 12066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.scan_lines = height; 12076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.stride = width; 12086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nLeft = 0; 12096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nTop = 0; 12106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nWidth = drv_ctx.video_resolution.frame_width; 12116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nHeight = drv_ctx.video_resolution.frame_height; 12126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 1213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 121561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 121661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentInit 1217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 121961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Initialize the component. 1220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 122261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ctxt -- Context information related to the self. 122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id -- Event identifier. This could be any of the following: 122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1. Command completion event 122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2. Buffer done callback event 122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3. Frame done callback event 1227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 122861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 122961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) 1233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 123561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_fmtdesc fdesc; 123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 123961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 124061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int alignment = 0,buffer_size = 0; 124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fds[2]; 124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int r,ret=0; 124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool codec_ambiguous = false; 12448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_STRING device_name = (OMX_STRING)DEVICE_NAME; 12458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Opening device %s", device_name); 124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = open(device_name, O_RDWR); 124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 12488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec::component_init(): Open device %s returned fd %d, errno %d", 124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan device_name, drv_ctx.video_driver_fd, errno); 125061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_driver_fd == 0) { 125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = open(device_name, O_RDWR); 125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_driver_fd < 0) { 12568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno); 125761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 126061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 1261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 12626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal ret = pthread_create(&async_thread_id,0,async_message_thread,this); 126361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret < 0) { 126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 12658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to create async_message_thread"); 126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcpy(inputfilename, INPUT_BUFFER_FILE_NAME); 1271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 127361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputBufferFile1 = fopen (outputfilename, "ab"); 1274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputExtradataFile = fopen (ouputextradatafilename, "ab"); 1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Copy the role information which provides the decoder kind 128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy(drv_ctx.kind,role,128); 128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\ 128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mpeg4",\ 128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.timestamp_adjust = true; 128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4; 128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingMPEG4; 128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_MPEG4; 129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Start Code for MPEG4*/ 129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_MPEG4; 129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "m4v"); 1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\ 129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mpeg2",\ 129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2; 130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_MPEG2; 130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingMPEG2; 130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Start Code for MPEG2*/ 130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_MPEG2; 130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "mpg"); 1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\ 131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 13128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("H263 Decoder selected"); 131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_H263; 131461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingH263; 131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_H263; 131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_H263; 131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 131961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "263"); 1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\ 132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 13248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW ("DIVX 311 Decoder selected"); 132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3; 132661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX_311; 132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = createDivxDrmContext(); 133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ 133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 13398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected"); 134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4; 134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX; 134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_ambiguous = true; 134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = createDivxDrmContext(); 134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\ 135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 13558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected"); 135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6; 135761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX; 135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_ambiguous = true; 136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = createDivxDrmContext(); 136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 136661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\ 137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_H264; 137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_H264; 137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingAVC; 137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_H264; 137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 1378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "264"); 1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\ 138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC; 138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_HEVC; 138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc; 138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_HEVC; 138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 138961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 13906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef INPUT_BUFFER_LOG 139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "265"); 13926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\ 139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_VC1; 139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingWMV; 139861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VC1; 139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_VC1_ANNEX_G; 140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "vc1"); 1403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\ 140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV; 140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingWMV; 140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VC1; 141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_VC1_ANNEX_L; 141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "vc1"); 1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",\ 141661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_VP8; 14195aa03230fef7a43a61e1ac5f19a2c5a71e5d6df7Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingVP8; 142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VP8; 142161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 14238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Unknown Component"); 142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan inputBufferFile1 = fopen (inputfilename, "ab"); 1428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 1430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.output_format = VDEC_YUV_FORMAT_NV12; 14326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE) 14336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 14346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (!client_buffers.set_color_format(dest_color_format)) { 14358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setting color format failed"); 14366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet = OMX_ErrorInsufficientResources; 14376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 1438dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 143961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan capture_capability= V4L2_PIX_FMT_NV12; 144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = subscribe_to_events(drv_ctx.video_driver_fd); 144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 14428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Subscribe Event Failed"); 144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_capability cap; 144761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap); 144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 14498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to query capabilities"); 145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 145161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s," 14538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " version = %d, capabilities = %x", cap.driver, cap.card, 145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan cap.bus_info, cap.version, cap.capabilities); 145561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=0; 145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index=0; 145961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 14608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 146161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.pixelformat, fdesc.flags); 146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index++; 146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index=0; 146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 14688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.pixelformat, fdesc.flags); 147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index++; 147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal update_resolution(320, 240); 147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 147461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 14808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set format on output port"); 148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set Format was successful"); 148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_ambiguous) { 148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (output_capability == V4L2_PIX_FMT_DIVX) { 148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control divx_ctrl; 148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) { 148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4; 148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) { 149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5; 149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6; 149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT; 149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl); 149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 14988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set divx version"); 149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 150061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Codec should not be ambiguous"); 150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 15128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set format on capture port"); 151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 15148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set Format was successful"); 151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE; 151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = 1; 15188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret); 151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 15218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret); 152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Get the Buffer requirements for input and output ports*/ 152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT; 152961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment=SZ_1M; 153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment=SZ_1M; 153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment=SZ_4K; 153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment=SZ_4K; 153661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata = 0; 153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.picture_order = VDEC_ORDER_DISPLAY; 154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.idr_only_decoding = 0; 1544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 15456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_state = OMX_StateLoaded; 1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA 15476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (eRet == OMX_ErrorNone && !secure_mode) 15486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal enable_extradata(DEFAULT_EXTRADATA, true, true); 1549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 15506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet=get_buffer_req(&drv_ctx.ip_buf); 15518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Input Buffer Size =%d",drv_ctx.ip_buf.buffer_size); 15526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal get_buffer_req(&drv_ctx.op_buf); 155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 || 155461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC) { 155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size; 155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size); 155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nOffset = 0; 155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 15618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed "); 156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils == NULL) { 156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils = new H264_Utils(); 156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils == NULL) { 15718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("parser utils Allocation failed "); 157261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size); 157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser = new h264_stream_parser(); 158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!h264_parser) { 158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!"); 158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 158361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 158561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pipe(fds)) { 15878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("pipe creation failed"); 158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 158961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 159061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int temp1[2]; 159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fds[0] == 0 || fds[1] == 0) { 159261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pipe (temp1)) { 15938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("pipe creation failed"); 159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 15956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //close (fds[0]); 159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //close (fds[1]); 159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fds[0] = temp1 [0]; 159961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fds[1] = temp1 [1]; 160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_in = fds[0]; 160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_out = fds[1]; 160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan r = pthread_create(&msg_thread_id,0,message_thread,this); 160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (r < 0) { 16068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("component_init(): message_thread creation failed"); 160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 16116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 161261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 16138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Component Init Failed"); 16148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Calling VDEC_IOCTL_STOP_NEXT_MSG"); 161561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 161661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL); 16178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Calling close() on Video Driver"); 161861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.video_driver_fd); 161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = -1; 162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 16218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec::component_init() success"); 162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 162361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer)); 162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 1625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 162861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 162961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetComponentVersion 1630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 163161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 163261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns the component version. 1633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 163561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan TBD. 1636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 163761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 163861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorNone. 1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 164061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_component_version 164261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan( 164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STRING componentName, 164561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* componentVersion, 164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* specVersion, 164761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_UUIDTYPE* componentUUID 164861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 16518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Comp Version in Invalid State"); 1652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 1653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 165461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* TBD -- Return the proper version */ 165561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (specVersion) { 165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan specVersion->nVersion = OMX_SPEC_VERSION; 165761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 1659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 166161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 166261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommand 1663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 166461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 166561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 1666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 166861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 167061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 167161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 1672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 167361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp, 167561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_COMMANDTYPE cmd, 167661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 param1, 167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR cmdData 167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 16808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command: Recieved a Command from Client"); 168161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 16828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State"); 1683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 1684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) { 16878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush " 168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "to invalid port: %lu", param1); 168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 1690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_wait(&m_cmd_lock); 16938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command: Command Processed"); 1694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 1695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommand 1700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 1703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 170461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 170561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 1709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_COMMANDTYPE cmd, 171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 param1, 171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR cmdData 171561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STATETYPE eState = (OMX_STATETYPE) param1; 171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bFlag = 1,sem_posted = 0,ret=0; 172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd); 17228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d", 172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state, eState); 172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (cmd == OMX_CommandStateSet) { 17268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued"); 17278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState); 172861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 172961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Loaded */ 173061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateLoaded) { 173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateIdle) { 173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //if all buffers are allocated or all ports disabled 173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done() || 173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) { 17368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle"); 173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 17388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending"); 173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Loaded */ 174561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 17468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded"); 174761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 174861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to WaitForResources */ 175261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 175461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 17558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources"); 175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Executing */ 175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 17598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing"); 176061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 176161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Pause */ 176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 17668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause"); 176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Invalid */ 177261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 17738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid"); 177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 17778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\ 177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eState); 177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 178361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 178461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is IDLE */ 178561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateIdle) { 178761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateLoaded) { 178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_done()) { 178961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* 179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Since error is None , we will post an event at the end 179161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan of this function definition 179261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 17938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded"); 179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 17958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending"); 179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Executing */ 180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 18038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 180561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 18068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 180761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state=OMX_StateExecuting; 18088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful"); 180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 181061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Idle */ 181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateIdle) { 18128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle"); 181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 181461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 181761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to WaitForResources */ 181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 18198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources"); 182061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 182161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 182261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 182361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Pause */ 182561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 182661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*To pause the Video core we need to start the driver*/ 182761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START, 182861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL) < */0) { 18298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED"); 183061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 183161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorHardware; 183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 18348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause"); 183561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 183661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Invalid */ 183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 18408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid"); 184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 184261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 184361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 18448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState); 184561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 184661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1847dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand } 1848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 184961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /******************************/ 185061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Executing */ 185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /******************************/ 185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateExecuting) { 18538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting"); 185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Idle */ 185561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateIdle) { 185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition 185861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 18598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle"); 186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 186161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 186261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 186361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 186461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_ALL); 186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Paused */ 186961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 18708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PAUSE Command Issued"); 187161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StatePause; 187261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Loaded */ 187561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 18768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded"); 187761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 187861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 188061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to WaitForResources */ 188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 18838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources"); 188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 188561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Executing */ 188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 18908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing"); 189161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 189261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 189361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 189461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Invalid */ 189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 18978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid"); 189861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 189961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 19018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState); 190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 190361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Pause */ 190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 190861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StatePause) { 190961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Executing */ 191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateExecuting) { 19118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pause --> Executing"); 191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StateExecuting; 191361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 191461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 191561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Idle */ 191661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateIdle) { 191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 19198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pause --> Idle"); 192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 192161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 192361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_ALL); 192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to loaded */ 192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 19308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> loaded"); 193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 193261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 193361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 193461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to WaitForResources */ 193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 19378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> WaitForResources"); 193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 193961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Pause */ 194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 19448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> Pause"); 194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 194661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 194961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Invalid */ 195061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 19518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> Invalid"); 195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 195361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 19558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState); 195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 195761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is WaitForResources */ 196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateWaitForResources) { 196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Loaded */ 196461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateLoaded) { 196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 19678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded"); 196861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 196961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to WaitForResources */ 197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 19718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources"); 197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState, 197361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Executing */ 197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 19788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing"); 197961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 198061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 198261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Pause */ 198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 19858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause"); 198661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 198761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Invalid */ 199161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 19928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid"); 199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 199561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Loaded - 199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan is NOT tested by Khronos TS */ 199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 20008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState); 200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 200261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 200461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /********************************/ 200561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Invalid */ 200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*******************************/ 200761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateInvalid) { 200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* State Transition from Inavlid to any state */ 200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == (OMX_StateLoaded || OMX_StateWaitForResources 201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || OMX_StateIdle || OMX_StateExecuting 201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || OMX_StatePause || OMX_StateInvalid)) { 20128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded"); 201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorInvalidState,\ 201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 2016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (cmd == OMX_CommandFlush) { 20188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued" 201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 202061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 202261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 202361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 202461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 20288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Semaphore"); 202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 203061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(param1); 203161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( cmd == OMX_CommandPortEnable) { 20348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued" 203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 203661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 203761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled = OMX_TRUE; 203861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 203961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (m_state == OMX_StateLoaded && 204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 204161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || allocate_input_done()) { 204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 20458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 204761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 204861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 20528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Enable output Port command recieved"); 205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled = OMX_TRUE; 205461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 205561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (m_state == OMX_StateLoaded && 205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (allocate_output_done())) { 205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 2059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 206161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 20628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 206461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (cmd == OMX_CommandPortDisable) { 20698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued" 207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 207261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled = OMX_FALSE; 207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_input_done()) { 207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 2076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 207861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 208461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 208561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 208661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled = OMX_FALSE; 20938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Disable output Port command recieved"); 209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 209561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_output_done()) { 209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 2097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 209961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 210661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 210961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 21148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd); 211561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNotImplemented; 211661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone && bFlag) { 211861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 212161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post(&m_cmd_lock); 212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 212961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ExecuteOmxFlush 2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 213261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Executes the OMX flush. 2133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan flushtype - input flush(1)/output flush(0)/ both. 2136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 2139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType) 2142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer v4l2_buf; 214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_decoder_cmd dec; 214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("in %s", __func__); 214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH; 215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (flushType) { 215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CORE_INPUT_PORT_INDEX: 215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = true; 215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT; 215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CORE_OUTPUT_PORT_INDEX: 215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = true; 215761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 216061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = true; 216161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = true; 216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | 216361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 216461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 216561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 216661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 21678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Flush Port (%lu) Failed ", flushType); 216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = false; 216961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 217061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush 2175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 217761a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at OUTPUT PORT. 2178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 218061a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone. 2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false 2184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 2185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush() 2186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1 = 0; // Parameter - 1 218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2 = 0; // Parameter - 2 218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident = 0; 219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = true; 219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Generate FBD for all Buffers in the FTBq*/ 219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 21948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initiate Output Flush"); 219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_ftb_q.m_size) { 21968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer queue size %d pending buf cnt %d", 219761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.m_size,pending_output_buffers); 219861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.pop_entry(&p1,&p2,&ident); 21998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ID(%x) P1(%x) P2(%x)", ident, p1, p2); 220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == m_fill_output_msg ) { 220161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_FBD) { 220361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 220461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 220661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 220761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = false; 220861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 220961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 221061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 221161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 221261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 22138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers); 221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush 2218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 222061a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at INPUT PORT. 2221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 222361a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone. 2224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 222661a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false 2227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 2228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush() 2229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i =0; 223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1 = 0; // Parameter - 1 223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2 = 0; // Parameter - 2 223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident = 0; 223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = true; 223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Generate EBD for all Buffers in the ETBq*/ 22378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initiate Input Flush"); 223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 223961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 22408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Check if the Queue is empty"); 224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_etb_q.m_size) { 224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 22458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_ETB) { 224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers++; 22498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 225161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 22538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p", 225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1); 225561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.flush_timestamp(); 225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Heap Buffers are to be flushed*/ 22608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (arbitrary_bytes && !(codec_config_flag)) { 22618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Reset all the variables before flusing"); 226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 226361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count = 0; 226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count = 0; 226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = 0; 226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 22708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initialize parser"); 227161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) { 227261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 227361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_input_pending_q.m_size) { 227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&p1,&p2,&ident); 227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1); 227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame) { 228161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame); 228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 228561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 228661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 228761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL, 228861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned int)NULL); 228961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 229061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 229161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.flush(); 22928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (codec_config_flag) { 22938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer " 22948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "is not sent to the driver yet"); 229561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 229661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = false; 229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 230061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 230161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 230461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.reset_ts_list(); 230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 23078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers); 230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 231361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 231461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommandEvent 2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Send the event to decoder pipe. This is needed to generate the callbacks 231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan in decoder thread context. 2319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 232161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 2322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 232461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 2325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1, 232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int p2, 232961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int id) 2330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 233561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (id == m_fill_output_msg || 233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_FBD) { 233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.insert_entry(p1,p2,id); 233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (id == OMX_COMPONENT_GENERATE_ETB || 234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_EBD || 234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.insert_entry(p1,p2,id); 234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cmd_q.insert_entry(p1,p2,id); 234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 23488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this); 234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_message(this, id); 235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 235861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNoMore; 235961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!profileLevelType) 236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 236161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nPortIndex == 0) { 236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 237061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 2) { 237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 23758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d", 237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->nProfileIndex); 237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // TODO 238161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 23828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d", 238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->nProfileIndex); 238461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) { 238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_H263Level70; 239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 23918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex); 239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 239361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 239461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 239961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 24028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex); 240361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 240461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 240561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 240861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 240961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple; 241061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 241161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain; 241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 241461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 24158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex); 241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 241761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 241961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 24208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu", profileLevelType->nPortIndex); 242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 242261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 242361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 242761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 242861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetParameter 2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 243161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Get Parameter method implementation 2432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 243361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 243461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 243761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Error None if successful. 2438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 243961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE paramIndex, 244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_PTR paramData) 2443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 24468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter:"); 244761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 24488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Param in Invalid State"); 2449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 245161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (paramData == NULL) { 24528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get Param in Invalid paramData"); 2453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 245561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)paramIndex) { 245661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPortDefinition: 245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 24608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition"); 246161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = update_portdef(portDefn); 246261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_port_def = *portDefn; 246461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 246561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 246661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoInit: 246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *portParamType = 246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 24708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit"); 247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 247261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nSize = sizeof(portParamType); 247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nPorts = 2; 247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nStartPortNumber = 0; 247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoPortFormat: 247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 24828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat"); 248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nSize = sizeof(portFmt); 248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nPortIndex) { 248861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nIndex) { 248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = OMX_COLOR_FormatUnused; 249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eCompressionFormat = eCompressionFormat; 249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 24938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore compression formats"); 249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 249561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (1 == portFmt->nPortIndex) { 249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 249861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 249961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nIndex) 250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE) 250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (1 == portFmt->nIndex) 250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar; 250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 25068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore Color formats"); 250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("returning %d", portFmt->eColorFormat); 251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 25118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: Bad port index %d", 251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portFmt->nPortIndex); 251361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamAudioInit: 251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *audioPortParamType = 252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 25228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit"); 252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 252461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nSize = sizeof(audioPortParamType); 252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nPorts = 0; 252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nStartPortNumber = 0; 252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamImageInit: 253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *imagePortParamType = 253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 25348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit"); 253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 253661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nSize = sizeof(imagePortParamType); 253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nPorts = 0; 253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nStartPortNumber = 0; 253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamOtherInit: 254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 25458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x", 254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedIndex; 254861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamStandardComponentRole: 255161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_COMPONENTROLETYPE *comp_role; 255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->nSize = sizeof(*comp_role); 255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 25578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d", 255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 255961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Added for parameter test */ 256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPriorityMgmt: 256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PRIORITYMGMTTYPE *priorityMgmType = 256861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PRIORITYMGMTTYPE *) paramData; 25698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt"); 257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 257161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmType->nSize = sizeof(priorityMgmType); 2572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 257461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 257561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Added for parameter test */ 257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamCompBufferSupplier: 257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 25808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier"); 258161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 258261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nSize = sizeof(bufferSupplierType); 258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == bufferSupplierType->nPortIndex) 258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (1 == bufferSupplierType->nPortIndex) 258761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 258861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 259461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoAvc: 259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 25968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x", 2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 259961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoH263: 260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x", 2603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 260461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg4: 260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x", 260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 261161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg2: 261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x", 2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 261661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 261761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoProfileLevelQuerySupported: 261961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex); 262161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType = 262261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData; 262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_supported_profile_level_for_1080p(profileLevelType); 262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 262561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: 262861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage"); 263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 263161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 263461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED | 263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan GRALLOC_USAGE_PRIVATE_UNCACHED); 263661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_ 263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else 264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 26428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x", (unsigned int)nativeBuffersUsage->nUsage); 264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 264461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 26458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!"); 264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 264761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 264861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 265061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 265161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 265261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 265361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex); 265561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedIndex; 265661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 265861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 26608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)", 266161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width, 266261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_height, 266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.stride, 266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.scan_lines); 2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 267661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((params == NULL) || 267761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (params->nativeBuffer == NULL) || 267861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (params->nativeBuffer->handle == NULL) || 267961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !m_enable_android_native_buffers) 2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_android_native_buffers = OMX_TRUE; 2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sp<android_native_buffer_t> nBuf = params->nativeBuffer; 2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private_handle_t *handle = (private_handle_t *)nBuf->handle; 268461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buffer = NULL; 268661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = (OMX_U8*)mmap(0, handle->size, 2688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 268961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == MAP_FAILED) { 269061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 2696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 270261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 270361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::Setparameter 2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 270561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 270661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Set Parameter method implementation. 2707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 270861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 270961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 2710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 2713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 271461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE paramIndex, 271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR paramData) 2718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 27206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal int ret=0; 27216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct v4l2_format fmt; 272261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 27238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Param in Invalid State"); 2724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (paramData == NULL) { 27278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Param in Invalid paramData"); 272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 2729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state != OMX_StateLoaded) && 273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 273261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_out_bEnabled == OMX_TRUE) && 273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_inp_bEnabled == OMX_TRUE)) { 27358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Param in Invalid State"); 2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)paramIndex) { 273961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPortDefinition: 2740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has 274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //been called. 27458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d", 274661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->format.video.nFrameHeight, 274761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->format.video.nFrameWidth); 274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_DirOutput == portDefn->eDir) { 27498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port"); 275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_display_id = portDefn->format.video.pNativeWindow; 275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffer_size; 275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_buffer_req(buffer_size)) { 27538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error in getting buffer requirements"); 275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount && 275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size ) { 275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual; 275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size = portDefn->nBufferSize; 276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(&drv_ctx.op_buf); 276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_port_def = *portDefn; 276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 27648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)", 276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size, 276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual, portDefn->nBufferSize); 276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (OMX_DirInput == portDefn->eDir) { 277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((portDefn->format.video.xFramerate >> 16) > 0 && 277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) { 277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Frame rate only should be set if this is a "known value" or to 277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // activate ts prediction logic (arbitrary mode only) sending input 277561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // timestamps with max value (LLONG_MAX). 277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu", 277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.xFramerate >> 16); 277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator); 278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.frame_rate.fps_numerator) { 278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 30; 278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator) 278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = (int) 278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator; 279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", 279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int, drv_ctx.frame_rate.fps_numerator / 279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)drv_ctx.frame_rate.fps_denominator); 279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 27948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port"); 279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_resolution.frame_height != 279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight || 279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width != 279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth) { 27998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("SetParam IP: WxH(%d x %d)", 280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth, 280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight); 280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portDefn->format.video.nFrameHeight != 0x0 && 280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth != 0x0) { 280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan update_resolution(portDefn->format.video.nFrameWidth, 280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight); 280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 28108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen 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); 281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 28138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Resolution failed"); 281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 281561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) { 282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf; 282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) & 282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (~(buffer_prop->alignment - 1)); 282461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(buffer_prop); 282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 28268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)", 282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size, 282861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual, portDefn->nBufferSize); 282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portDefn->eDir == OMX_DirMax) { 283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->nPortIndex); 283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 283861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoPortFormat: 2839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret=0; 284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 28448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d", 284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat); 284661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (1 == portFmt->nPortIndex) { 284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum vdec_output_fromat op_format; 285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) || 285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar)) 285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12; 285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (portFmt->eColorFormat == 285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_COLOR_FORMATTYPE) 285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka) 286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_format = VDEC_YUV_FORMAT_TILE_4x2; 286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.output_format = op_format; 286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 28688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set output format failed"); 286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 287161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.set_color_format(portFmt->eColorFormat)) { 28778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set color format failed"); 287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexPortDefn: 2886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt = 288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData; 28898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d", 289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nFramePackingFormat); 289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Input port */ 289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portFmt->nPortIndex == 0) { 289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) { 289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session"); 289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = true; 290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portFmt->nFramePackingFormat == 290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_FramePacking_OnlyOneCompleteFrame) { 290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 290561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu", 290761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nFramePackingFormat); 290861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 29118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port"); 291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid && 291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nMemRegion < OMX_QCOM_MemRegionMax) && 291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) { 291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_region_smi = OMX_TRUE; 291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 29178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set"); 291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem = OMX_TRUE; 291961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamStandardComponentRole: 29266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal { 292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_COMPONENTROLETYPE *comp_role; 292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 29298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s", 293061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->cRole); 293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded)&& 293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Set Parameter called in valid state"); 293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 294661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 294761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 295361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 296061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 296261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 296361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 296461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 296761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) 297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) { 297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) { 298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 299261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 299461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) || 299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) { 299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 299961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 30028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind); 300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 300561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 30066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 300761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 300861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPriorityMgmt: 3009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state != OMX_StateLoaded) { 30118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 301361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 301461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 30158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d", 301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmtype->nGroupID); 3017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 30188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d", 301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmtype->nGroupPriority); 3020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 302261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 3023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamCompBufferSupplier: 30286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal { 302961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 30308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d", 303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->eBufferSupplier); 303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 30416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoAvc: 304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d", 304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 304661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoH263: 304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d", 305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg4: 305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d", 305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg2: 306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d", 306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoDecoderPictureOrder: 306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder = 306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData; 307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pic_order,rc=0; 30728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d", 307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pictureOrder->eOutputPictureOrder); 307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) { 307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) { 307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = pic_order; 308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 30868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set picture order failed"); 308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamConcealMBMapExtraData: 309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false, 309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 30978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamFrameInfoExtraData: 310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false, 310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 31078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamInterlaceExtraData: 311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false, 311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 31178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamH264TimeInfo: 312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false, 312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 31268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 312861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoDivx: 313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData; 313361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 313461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexPlatformPvt: 313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 31378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port"); 313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData; 313961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type); 314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 314261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_pvt_entry_pmem = OMX_TRUE; 314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 31458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set"); 314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem = OMX_TRUE; 314761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 314961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 315061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 315161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 315261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoSyncFrameDecodingMode: 315361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 315461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 315561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode"); 315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 315761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.idr_only_decoding = 1; 315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 316061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 316161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 316261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 31638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set picture order failed"); 316461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 316561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 316661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE; 316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE; 316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 31708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Sync frame setting failed"); 317161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 317261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 317461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 317761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamIndexExtraDataType: 317861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 317961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 318061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData; 318161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) && 318261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (extradataIndexType->bEnabled == OMX_TRUE) && 318361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (extradataIndexType->nPortIndex == 1)) { 31848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming"); 318561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled); 318661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 318861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 318961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 319061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamEnableSmoothStreaming: 3192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 319361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 319461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER; 319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = 1; 319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 319861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc < 0) { 319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver."); 320061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorHardware; 320161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Need to allow following two set_parameters even in Idle 320661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * state. This is ANDROID architecture which is not in sync 320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * with openmax standard. */ 320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: 320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 321061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enableNativeBuffers) { 321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_enable_android_native_buffers = enableNativeBuffers->enable; 321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 321461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: 321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 321861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = use_android_native_buffer(hComp, paramData); 321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 322061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 322261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamEnableTimeStampReorder: 322361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData; 322561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) { 322661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (reorder->bEnable == OMX_TRUE) { 322761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int =0; 322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(true); 322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 323061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 323161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 323261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 323361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (reorder->bEnable == OMX_TRUE) { 323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 323561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 323661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 323961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 324061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 32418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex); 324261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedIndex; 324361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 324461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 324561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 324961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 325061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetConfig 3251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 325261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 325361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Get Config Method implementation. 3254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 325661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 325961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 3260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp, 326361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE configIndex, 326461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_PTR configData) 3265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 326861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 32698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Config in Invalid State"); 327061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 327161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 327261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 327361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)configIndex) { 327461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexConfigInterlaced: 327561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 327661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_CONFIG_INTERLACETYPE *configFmt = 327761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_CONFIG_INTERLACETYPE *) configData; 327861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configFmt->nPortIndex == 1) { 327961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configFmt->nIndex == 0) { 328061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive; 328161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configFmt->nIndex == 1) { 328261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = 328361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 328461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configFmt->nIndex == 2) { 328561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = 328661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 328761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 328861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:" 32898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore Interlaced formats"); 329061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 329161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 329261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 329361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 32948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port", 329561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)configFmt->nPortIndex); 329661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 329761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 329861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 329961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 330061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexQueryNumberOfVideoDecInstance: 330161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 330261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances = 330361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData; 330461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoderinstances->nNumOfInstances = 16; 330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 330661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 330761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexConfigVideoFramePackingArrangement: 330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 331161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt = 331261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData; 331361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->get_frame_pack_data(configFmt); 331461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 331561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs"); 331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 331761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 331861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 331961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexConfigCommonOutputCrop: 332061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 332161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 332261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE)); 332361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 332461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 332561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 332661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 33278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex); 332861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 332961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 333061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 333161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 333261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 333361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 333761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 333861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SetConfig 3339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 334061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 334161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Set Config method implementation 3342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 334361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 334461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 334761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp, 335061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE configIndex, 335161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR configData) 3352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 33548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Config in Invalid State"); 335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 335661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 335761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_CONFIG_NALSIZE *pNal; 336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set Config Called"); 336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 336361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateExecuting) { 33648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("set_config:Ignore in Exe state"); 336561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 336661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 336861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) { 336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData; 33708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData called"); 337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) { 33728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData AVC"); 337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 extra_size; 337461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Parsing done here for the AVC atom is definitely not generic 337561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Currently this piece of code is working, but certainly 337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // not tested with all .mp4 files. 337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Incase of failure, we might need to revisit this 337861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // for a generic piece of code. 337961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Retrieve size of NAL length field 338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // byte #4 contains the size of NAL lenght field 338261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length = (config->pData[4] & 0x03) + 1; 338361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 338461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_size = 0; 338561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length > 2) { 338661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Presently we assume that only one SPS and one PPS in AvC1 Atom */ 338761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_size = (nal_length - 2) * 2; 338861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 338961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 339061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // SPS starts from byte #6 339161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]); 339261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pDestBuf; 3393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 339461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 339561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // minus 6 --> SPS starts from byte #6 339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // minus 1 --> picture param set byte to be ignored from avcatom 339761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size; 339861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize); 339961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 len; 340061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 index = 0; 340161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // case where SPS+PPS is sent as part of set_config 340261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf = m_vendor_config.pData; 340361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 34048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]", 340561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex, 340661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize, 340761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData); 340861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (index < 2) { 340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint8 *psize; 341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = *pSrcBuf; 341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = len << 8; 341261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len |= *(pSrcBuf + 1); 341361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psize = (uint8 *) & len; 341461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(pDestBuf + nal_length, pSrcBuf + 2,len); 341561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (unsigned int i = 0; i < nal_length; i++) { 341661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf[i] = psize[nal_length - 1 - i]; 341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //memcpy(pDestBuf,pSrcBuf,(len+2)); 341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf += len + nal_length; 342061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pSrcBuf += len + 2; 342161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index++; 342261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pSrcBuf++; // skip picture param set 342361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = 0; 342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") || 342661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) { 3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 3428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize = config->nDataSize; 342961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize)); 343061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData,config->nDataSize); 343161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) { 343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_vendor_config.pData) { 343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_vendor_config.pData); 343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = NULL; 343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = 0; 343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 343861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (((*((OMX_U32 *) config->pData)) & 343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE_MASK) == 344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE) { 34418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 simple/main profile"); 344261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 344361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 344461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = 344561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *) malloc(config->nDataSize); 344661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData, 344761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan config->nDataSize); 344861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_SP_MP_RCV; 344961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) { 34508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 Advance profile"); 345161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 345261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 345361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = 345461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *) malloc((config->nDataSize)); 345561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData, 345661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan config->nDataSize); 345761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_AP; 345861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) { 34598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only"); 346061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 346161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 346261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize); 346361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData,config->pData,config->nDataSize); 346461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_SP_MP_RCV; 346561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 34668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile"); 346761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 346961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 347061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configIndex == OMX_IndexConfigVideoNalSize) { 347161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData); 347361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length = pNal->nNaluBytes; 347461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 34758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d",nal_length); 347661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 347961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 348361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 348461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetExtensionIndex 3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 348661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 348761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX GetExtensionIndex method implementaion. <TBD> 3488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 348961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 349061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 349261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 349361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 349561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 349761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_STRING paramName, 349861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_INDEXTYPE* indexType) 3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 350061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 35018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Extension Index in Invalid State"); 3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 350361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) { 3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode; 350561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) { 3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType; 3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 350961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) { 3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 351161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) { 3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 351361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) { 35148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extension: %s is supported", paramName); 3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 351661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) { 3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 352061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 35218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName); 3522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNotImplemented; 3523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 352861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 352961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetState 3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 353161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 353261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns the state information back to the caller.<TBD> 3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 353461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 353561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 353761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 353861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Error None if everything is successful. 353961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp, 354161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STATETYPE* state) 3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 354361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *state = m_state; 35448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_state: Returning the state %d",*state); 354561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 354961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 355061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentTunnelRequest 3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 355261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 355361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Component Tunnel Request method implementation. <TBD> 3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 355561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 355661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 355861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 355961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 356161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 356361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 356461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE peerComponent, 356561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 peerPort, 356661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 3567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 35688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented"); 356961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 3570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 357361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 357461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseOutputBuffer 3575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 357661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 357761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper function for Use buffer in the input pin 3578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 357961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 358061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 3581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 358261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 358361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 3584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 358561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 35866eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_extradata() 35876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 35886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 358961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.buffer_size) { 359061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) { 359161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 359261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 359361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 359461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 359561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095); 35968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("allocate extradata memory size %d", drv_ctx.extradata_info.size); 359761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory( 359861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size, 4096, 359961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.extradata_info.ion.ion_alloc_data, 360061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.extradata_info.ion.fd_ion_data, 0); 360161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.ion.ion_device_fd < 0) { 36028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to alloc extradata memory"); 360361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 360461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 360561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.uaddr = (char *)mmap(NULL, 360661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size, 360761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, 360861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.ion.fd_ion_data.fd , 0); 360961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.uaddr == MAP_FAILED) { 36108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to map extradata memory"); 361161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 361261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 361361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 361461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 361561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size); 361661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 361861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 36196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 36206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 362161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_extradata() 362261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 36236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 362461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.uaddr) { 362561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 362661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 362761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 362861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 362961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 36306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 36316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 36326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 3633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_output_buffer( 363461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 363561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 363661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 363761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 363861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 363961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 364161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 364261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 364361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; // Temporary counter 364461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 364561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PTR privateAppData = NULL; 364661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan private_handle_t *handle = NULL; 364761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *buff = buffer; 364861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 364961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 365061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 36516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 365261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 365361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers"); 365461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_output_headers(); 365561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 365661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_extradata(); 365761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 365861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 365961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 366061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 366161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,i)) { 366261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 366361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 366561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 366661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 366761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i >= drv_ctx.op_buf.actualcount) { 36688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount); 366961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 367061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 367261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 367361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 367461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 367561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_use_android_native_buffers) { 367661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 367761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sp<android_native_buffer_t> nBuf = params->nativeBuffer; 367861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle = (private_handle_t *)nBuf->handle; 367961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = params->pAppPrivate; 368061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 368161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle = (private_handle_t *)buff; 368261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 368361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 368461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 368561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 368661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 368761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " expected %u, got %lu", 368861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size); 368961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 369061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 369161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 369261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size; 369361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_use_android_native_buffers) { 369461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 369561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buff = (OMX_U8*)mmap(0, handle->size, 369661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 369761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buff == MAP_FAILED) { 369861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 369961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 370061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 37016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 37026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 37036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#if defined(_ANDROID_ICS_) 370461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan native_buffer[i].nativehandle = handle; 370561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan native_buffer[i].privatehandle = handle; 37066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 370761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!handle) { 370861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 370961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 371061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 371161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 371261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = 0; 371361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 371461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = 371561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 371661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 3717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 371961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ouput_egl_buffers && !m_use_output_pmem) { 3720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 37218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("allocate output buffer memory size %d", drv_ctx.op_buf.buffer_size); 372261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 372361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 372461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 372561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0); 372661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 37278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd); 372861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 372961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 373061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 373161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 3732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 373361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 373461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan open (MEM_DEVICE,O_RDWR); 3735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 373661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 37378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 373861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 373961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 374161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */ 374261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) { 374361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 374461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan open (MEM_DEVICE,O_RDWR); 374561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 37468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 374761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 374861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 374961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 375161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 375261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size, 375361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment)) { 37548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 375561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 375661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 375761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 375961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 376061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 376161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 376261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, 376361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 376461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 376561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 3766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 376761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 3768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 37698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unable to mmap output buffer"); 377061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 377161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 377261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 377361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = 0; 377461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 377561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 377661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 377761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem); 377861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!appData || !bytes ) { 377961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && !buffer) { 37808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case"); 378161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 378261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 378361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 378461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 378561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 378661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 378761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 378861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pmem_list->entryList || !pmem_list->entryList->entry || 378961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !pmem_list->nEntries || 379061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 37918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pmem info not valid in use buffer"); 379261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 379361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 379461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 379561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list->entryList->entry; 379661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x", 379761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info->pmem_fd); 379861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 379961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 380061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 380161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = 380261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 380361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 3804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 380561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 380661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd; 380761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 380861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_out_mem_ptr + i ); 380961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 381061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 381161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 381261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 381361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 381461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i, 381661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr, 381761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd ); 381861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 381961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 382061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 382161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 382261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 382361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 382461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 382561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd; 382661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 382761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 382861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 382961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 383061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 383161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 383261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION 383361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 383461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 383561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 383661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 383761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 38388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 383961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 3840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 384161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 384261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 384361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]); 3845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 384661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) { 38478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to prepare bufs"); 384861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 384961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 3850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 385261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) { 385361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 385461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 385561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) { 385661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 385761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 385861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = true; 38598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("STREAMON Successful"); 386061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 386261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 386361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 386461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 386561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle); 386661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = (OMX_U8 *)handle; 386761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 386861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = buff; 386961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 387061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pAppPrivate = privateAppData; 387161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_out_bm_count,i); 387261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 387361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 387761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 387861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::use_input_heap_buffers 3879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 388061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 388161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use Buffer Heap allocation method implementation. 3882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 388361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 388461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 388661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 388761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None , if everything successful. 3888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 388961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_input_heap_buffers( 389161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 389261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 389361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 389461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 389561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 389661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 38988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer); 389961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 390061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_heap_ptr) 390161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 390261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 390361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 390461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_phdr_pmem_ptr) 390561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 390661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 390761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 390861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) { 390961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficent memory"); 391061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 391161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) { 391261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_use_buffer = true; 391361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 391461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 391561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 391661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 391761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 391861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 391961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 392061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 39218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 392261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], 392361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 39248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 392561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 392661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 392761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_in_alloc_cnt++; 392861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 392961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("All i/p buffers have been set!"); 393061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 393161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 393261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 393661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 393761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseBuffer 3938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 393961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 394061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use Buffer method implementation. 3941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 394261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 394361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 394561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 394661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None , if everything successful. 3947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 394861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_buffer( 395061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 395161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 395261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 395361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 395461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 395561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 395761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE error = OMX_ErrorNone; 395861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 395961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 396061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || bytes == 0) { 396161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && buffer == NULL) { 396261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer); 396361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 396461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 396561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 396661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 39678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Use Buffer in Invalid State"); 396861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 396961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 397061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) 397161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 397261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (port == OMX_CORE_OUTPUT_PORT_INDEX) 397361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested 397461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 39758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 397661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = OMX_ErrorBadPortIndex; 397761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 397861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error); 397961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error == OMX_ErrorNone) { 398061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 398161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 398261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 398361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandStateSet,OMX_StateIdle, 398461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 398561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 398661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 398761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 398861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 398961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 399061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX, 399161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 399261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 399361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 399461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 399561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 399661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 399761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 399861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 399961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 400061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return error; 400161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex, 400461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *pmem_bufferHdr) 4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 400661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) { 400761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr[bufferindex].pBuffer) 400861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_inp_heap_ptr[bufferindex].pBuffer); 400961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[bufferindex].pBuffer = NULL; 401061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 401161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_bufferHdr) 401261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(pmem_bufferHdr); 401361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 4014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 401861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 401961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || m_inp_mem_ptr == NULL) { 402061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 402161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 402361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufferHdr - m_inp_mem_ptr; 40248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 402561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 402661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) { 40278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 402861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) { 402961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 403061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT; 403161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 403261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 40338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the input buffer fd=%d", 4034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].pmem_fd); 40358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the input buffer size=%d address = %d", 4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].mmaped_size, 4037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].bufferaddr); 403861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 403961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].mmaped_size); 404061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.ptr_inputbuffer[index].pmem_fd); 404161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 404261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) { 404361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_desc_buffer_ptr[index].buf_addr); 404461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].buf_addr = NULL; 404561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].desc_data_size = 0; 404661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 404861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 4049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 405061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 405361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 4054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 405861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 4059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 406061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || m_out_mem_ptr == NULL) { 406161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 406261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 406461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufferHdr - m_out_mem_ptr; 40658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index); 4066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 406761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < drv_ctx.op_buf.actualcount 406861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_outputbuffer) { 40698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %x", index, 407061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].bufferaddr); 4071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 407261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 407361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 407461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 407561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 4076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 407761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 407861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 407961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 408061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].mmaped_size); 408161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 408261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 408361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 4084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 408561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) { 40868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the output buffer fd = %d", 408761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].pmem_fd); 40888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the ouput buffer size=%d address = %d", 408961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount, 409061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].bufferaddr); 409161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr, 409261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount); 409361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.ptr_outputbuffer[0].pmem_fd); 409461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].pmem_fd = -1; 4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 409661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[0]); 4097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 409861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 410061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 410261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 410361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_extradata(); 410461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 4106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 410761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 4108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 411261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE **bufferHdr, 411361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 port, 411461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PTR appData, 411561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 bytes) 4116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 411761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *input = NULL; 411861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *buf_addr = NULL; 411961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 412061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i = 0; 412161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 412261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Sanity Check*/ 412361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL) { 412461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 412561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 412661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 412761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr == NULL) { 412861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 412961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 413061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 413161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 413261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 413361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 413461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 413561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr == NULL) { 41368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("m_inp_heap_ptr Allocation failed "); 413761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 413861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 413961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 414061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 414161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Find a Free index*/ 414261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 414361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) { 41448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 414561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 414661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 414761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 414861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 414961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.ip_buf.actualcount) { 415061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 415161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 415261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_addr == NULL) { 415361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 415461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 415561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 415661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_inp_heap_ptr + i); 415761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input = *bufferHdr; 415861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_heap_inp_bm_count,i); 415961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 416061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)buf_addr; 416161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 416261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nVersion.nVersion = OMX_SPEC_VERSION; 416361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nAllocLen = drv_ctx.ip_buf.buffer_size; 416461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pAppPrivate = appData; 416561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 41668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr ); 416761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 41688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]); 416961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Add the Buffers to freeq*/ 417061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i], 417161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 41728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 417361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 417461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 417561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 417661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 417761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 417861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 417961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 418561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 418661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateInputBuffer 4187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 418861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 418961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper function for allocate buffer in the input pin 4190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 419261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 419561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_buffer( 419961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 420061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 420161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 420261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 420361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 420661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 420761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 420861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *input = NULL; 420961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i = 0; 421061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *buf_addr = NULL; 421161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pmem_fd = -1; 4212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 421361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bytes != drv_ctx.ip_buf.buffer_size) { 42148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Requested Size is wrong %d epected is %d", 421561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes, drv_ctx.ip_buf.buffer_size); 421661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 421761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 421961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_mem_ptr) { 42208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%d)", 422161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount, 422261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size); 4223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 422461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 422561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 4226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 422761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr == NULL) { 422861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 422961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 423161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \ 423261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount); 4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 423461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer == NULL) { 423561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 423661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 423861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \ 423961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount); 4240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 424161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ip_buf_ion_info == NULL) { 424261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 424361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 424661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.ip_buf.actualcount; i++) { 424761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 4248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 424961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 4250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 425161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 425461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 425561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 42568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 425761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 425861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 426161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.ip_buf.actualcount) { 426261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 426361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 426461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 42656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 4266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 42678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Allocate input Buffer size %d", drv_ctx.ip_buf.buffer_size); 426861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 426961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 427061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 427161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0); 427261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 427361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 427461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 427561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 4276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 427761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 427961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 42808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 428161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 428261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 428461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd == 0) { 428561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 428761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 42888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 428961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 429061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 429161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 429361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size, 429461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment)) { 42958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 429661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 429761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 429861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 430061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 430161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_addr = (unsigned char *)mmap(NULL, 430261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size, 430361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 4304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 430561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_addr == MAP_FAILED) { 430661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 4307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 430861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 4309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 43108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Map Failed to allocate input buffer"); 431161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 431261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 431361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 431461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_inp_mem_ptr + i); 431561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 431661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr; 431761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 431861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 431961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 432061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 432161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 432261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].offset = 0; 432361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 432461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 432561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 432661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 432761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 432861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.bytesused = 0; 432961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size; 433061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr; 433161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd; 433261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[1] = 0; 433361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset; 433461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = &plane; 433561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = 1; 433661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]); 433861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 433961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 434061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 434161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 43428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to prepare bufs"); 434361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 434461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 4345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 434761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input = *bufferHdr; 434861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_inp_bm_count,i); 43498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr); 435061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 435161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd; 435261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 435361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)buf_addr; 435461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 435561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nVersion.nVersion = OMX_SPEC_VERSION; 435661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nAllocLen = drv_ctx.ip_buf.buffer_size; 435761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pAppPrivate = appData; 435861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 435961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; 436061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 436161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.disable_dmx) { 436261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_desc_buffer(i); 436361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 436461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found"); 436661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 436761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 436861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 437361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 437461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateOutputBuffer 4375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 437661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 437761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper fn for AllocateBuffer in the output pin 4378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 437961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 438061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 4381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 438261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 438361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went well. 4384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 438561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_buffer( 438761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 438861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 438961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 439061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 439161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 439361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 439461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 439561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; // Temporary counter 439661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 439761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 4398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 439961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ion_device_fd =-1; 440061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_allocation_data ion_alloc_data; 440161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_fd_data fd_ion_data; 4402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 440361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 44048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%d)", 440561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount, 440661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 440761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nBufHdrSize = 0; 440861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformEntrySize = 0; 440961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformListSize = 0; 441061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPMEMInfoSize = 0; 441161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pmem_fd = -1; 441261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *pmem_baseaddress = NULL; 441361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 441461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 441561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 441661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 441761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)", 441961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 442061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufHdrSize = drv_ctx.op_buf.actualcount * 442161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE); 442261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 442361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize = drv_ctx.op_buf.actualcount * 442461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 442561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize = drv_ctx.op_buf.actualcount * 442661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 442761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformEntrySize = drv_ctx.op_buf.actualcount * 442861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 442961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize, 443161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE), 443261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize, 443361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize); 44348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize, 443561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 44378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("allocate outputBuffer size %d",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount); 443861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_device_fd = alloc_map_ion_memory( 443961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount, 444061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment, 444161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0); 444261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ion_device_fd < 0) { 444361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 444461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 444561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = fd_ion_data.fd; 4446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 444761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 444961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 44508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d", 445161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 445261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 445361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 445561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd == 0) { 445661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 445861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 44598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d", 446061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 446161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 446261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 446361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 446561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size * 446661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount, 446761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment)) { 44688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 446961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 447061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 447161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 447361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 447461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress = (unsigned char *)mmap(NULL, 447561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.op_buf.buffer_size * 447661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount), 447761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 447861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_baseaddress == MAP_FAILED) { 44798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("MMAP failed for Size %d", 448061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 448161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 4482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 448361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 4484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 448661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 448761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 448861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 448961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Alloc mem for platform specific info 449061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *pPtr=NULL; 449161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 449261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize,1); 449361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\ 449461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_bufferpayload), 449561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 449661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 449761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo), 449861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 450061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = (struct vdec_ion *)\ 450161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_ion), 450261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 450561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 450661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_respbuffer) { 450761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size = 450861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.op_buf.buffer_size * 450961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 451061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr = m_out_mem_ptr; 451161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 451261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 451361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_list) + nPlatformListSize); 451461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 451561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_entry) + nPlatformEntrySize); 451661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList = m_platform_list; 451761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry = m_platform_entry; 451861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = m_pmem_info; 451961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 45208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 452161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 452261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Settting the entire storage nicely 45238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry); 45248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 452561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 452661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 452761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 452861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Set the values when we determine the right HxW param 452961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nAllocLen = bytes; 453061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nFilledLen = 0; 453161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pAppPrivate = appData; 453261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 453361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Platform specific PMEM Information 453461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform Entry 45358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i); 453661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 453761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->entry = pPMEMInfo; 453861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform List 453961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->nEntries = 1; 454061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->entryList = pPlatformEntry; 454161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep pBuffer NULL till vdec is opened 454261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pBuffer = NULL; 454361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOffset = 0; 454461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 454561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i; 454661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->pmem_fd = 0; 454761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pPlatformPrivate = pPlatformList; 454861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 454961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd; 455061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].pmem_fd = pmem_fd; 4551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 455261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd; 455361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data; 455461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data; 4555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 455761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create a mapping between buffers*/ 455861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 455961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 456061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ptr_outputbuffer[i]; 456161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i; 456261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 456361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i); 456461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 45658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pmem_fd = %d offset = %d address = %p", 456661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd, drv_ctx.ptr_outputbuffer[i].offset, 456761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr); 456861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the buffer and buffer header pointers 456961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr++; 457061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo++; 457161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry++; 457261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList++; 457361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 457461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 45758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 457661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr, pPtr); 457761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 457861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_out_mem_ptr); 457961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 458061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 458161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pPtr) { 458261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(pPtr); 458361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = NULL; 458461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 458561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 458661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_outputbuffer); 458761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 458861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 458961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 459061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_respbuffer); 459161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 459261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 459461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info) { 45958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 459661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 459761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = NULL; 459861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 460061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 460161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 460261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 460361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_extradata(); 460461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 460561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 460661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 460761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,i)) { 46088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i); 460961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 461061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 461361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 461461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.op_buf.actualcount) { 461561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 461661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 461761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 461861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 461961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 462061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = 462161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size; 462261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 462361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_out_mem_ptr + i ); 462461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 462561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 462661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 462761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size; 462861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 462961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 463061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 463161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 463261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 463361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 463461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 46356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 463661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 46376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 463861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 463961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 464061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 464161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 464261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 464361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 4644b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION 464561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 4646b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif 464761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 464861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 464961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 46508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx); 465161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 465261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 465361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 465461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 46558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]); 465661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 465761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 465861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 465961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 466061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 466161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 466261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 466361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 466461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 466561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 466661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 466761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 466861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 466961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = true; 46708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("STREAMON Successful"); 467161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 467261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 467361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 467461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 467561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pAppPrivate = appData; 467661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_out_bm_count,i); 467761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 46788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient"); 467961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 468061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 468361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer -- API Call 4688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 468961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 469061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateBuffer 4691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 469261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 469361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 469561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 469661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 469861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 469961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 470161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 470361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 470461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 470561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 470661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i = 0; 4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 4710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 47118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port); 471261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 47138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Allocate Buf in Invalid State"); 4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 471761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 471861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 471961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes); 472061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 472161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); 472261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 472361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 47246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port, 47256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal appData,bytes); 472661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 47278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 472861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 4729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 473161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 473261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done()) { 473361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 4734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet,OMX_StateIdle, 473761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 474061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) { 474161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 474261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 474361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX, 4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 474661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 474861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) { 474961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 475061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 4751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 475261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 475361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 47578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet); 4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call 4762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 476361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 476461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::FreeBuffer 4765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 476661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 4767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 476861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 476961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 477161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 477261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 477461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 477661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 477761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 4778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 4780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int nPortIndex; 47818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("In for decoder free_buffer"); 4782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 478361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateIdle && 478461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 47858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" free buffer while Component in Loading pending"); 478661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 478761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) { 47888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Buffer while port %d disabled", port); 478961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((port == OMX_CORE_INPUT_PORT_INDEX && 479061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) || 479161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (port == OMX_CORE_OUTPUT_PORT_INDEX && 479261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) { 47938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Buffer while port %d enable pending", port); 479461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) { 47958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled"); 4796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 479761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorPortUnpopulated, 479861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 480161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_state != OMX_StateInvalid) { 48028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers"); 4803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 480461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorPortUnpopulated, 480561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 480861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 480961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if arbitrary bytes*/ 481061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes && !input_use_buffer) 481161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer - m_inp_mem_ptr; 481261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 481361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer - m_inp_heap_ptr; 4814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex); 481661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex < drv_ctx.ip_buf.actualcount) { 481761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Clear the bit associated with it. 481861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 481961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 482061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 482161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 48228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex); 482361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) 482461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 482561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 482661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 482761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) 482861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]); 482961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 483061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(nPortIndex,NULL); 483161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 483261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(buffer); 4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 483461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated = OMX_FALSE; 483561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Free the Buffer Header*/ 483661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_input_done()) { 48378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("ALL input buffers are freed/released"); 483861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer_header(); 483961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 484061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 48418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid"); 4842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 484561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 484661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_input_done()) { 48478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 4848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 4849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortDisable, 485061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX, 485161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 485361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // check if the buffer is valid 48556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 485661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex < drv_ctx.op_buf.actualcount) { 48578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex); 4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Clear the bit associated with it. 4859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 4860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bPopulated = OMX_FALSE; 48616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal client_buffers.free_output_buffer (buffer); 4862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 486361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 486461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_output_buffer_header(); 4865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 486661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 48678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid"); 4868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 487061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 487161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_output_done()) { 48728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it"); 4873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 487561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 48766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_ 487761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 487861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 487961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 488061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 48816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 4882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 488361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable, 488461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 488561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 488761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 4888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 489061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((eRet == OMX_ErrorNone) && 489161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 489261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_done()) { 4893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet, OMX_StateLoaded, 489661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 490461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 490561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::EmptyThisBuffer 4906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 490761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 490861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan This routine is used to push the encoded video frames to 490961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the video decoder. 4910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 491161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 491261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 491461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 491561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went successful. 4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 491761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 491961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 492161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret1 = OMX_ErrorNone; 492261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 4923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 49248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 49258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan codec_config_flag = true; 49268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__); 49278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 492861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 49298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Empty this buffer in Invalid State"); 493061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 493161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 493361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL) { 49348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL"); 493561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 493661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 493861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_bEnabled) { 49398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled."); 494061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 494161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 494361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) { 49448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %lu", buffer->nInputPortIndex); 494561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 494661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 494861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ 494961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (iDivXDrmDecrypt) { 495061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer); 495161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drmErr != OMX_ErrorNone) { 495261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // this error can be ignored 49538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ERROR:iDivXDrmDecrypt->Decrypt %d", drmErr); 495461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 495561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 495661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif //_ANDROID_ 495761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 495861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!latency) { 495961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.stop(); 496061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan latency = dec_time.processing_time_us(); 496161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 496261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 496361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 496461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 496561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 496661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_heap_ptr; 496761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 496861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 496961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_heap_ptr; 497061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 497161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 497261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 497361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = &m_inp_mem_ptr[nBufferIndex]; 497461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d", 497561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen); 497661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 497761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_mem_ptr; 497861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 497961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 498061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 498161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nBufferIndex > drv_ctx.ip_buf.actualcount ) { 49828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid"); 498361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 498461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 498561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 498661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)", 498761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen); 498861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 498961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned)hComp,(unsigned)buffer, 499061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_ETB_ARBITRARY); 499161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 499261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_TIMEINFO_EXTRADATA)) 499361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(buffer->nTimeStamp); 499461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB); 499561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 499761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 499861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 499961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/* ====================================================================== 500061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 500161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::empty_this_buffer_proxy 500261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 500361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 500461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan This routine is used to push the encoded video frames to 500561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the video decoder. 500661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 500761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 500861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 500961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 501061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 501161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went successful. 501261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 501361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 501461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 501561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 501661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 501761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int push_cnt = 0,i=0; 501861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned nPortIndex = 0; 501961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 502061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_input_frameinfo frameinfo; 502161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *temp_buffer; 502261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_seqheader seq_header; 502361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool port_setting_changed = true; 502461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool not_coded_vop = false; 502561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 502661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Should we generate a Aync error event*/ 502761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || buffer->pInputPortPrivate == NULL) { 50288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid"); 502961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 503061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 503161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 503261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 503361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 503461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex > drv_ctx.ip_buf.actualcount) { 50358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 503661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex); 503761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 503861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 503961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 504061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers++; 504161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 504261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return zero length and not an EOS buffer */ 504361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes && (buffer->nFilledLen == 0) && 504461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) { 50458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("return zero legth buffer"); 504661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 504761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 504861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 504961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 505261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) { 505361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4StreamType psBits; 505461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset); 505561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.numBytes = buffer->nFilledLen; 505661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4_headerparser.parseHeader(&psBits); 505761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan not_coded_vop = mp4_headerparser.is_notcodec_vop( 505861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 505961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (not_coded_vop) { 50608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Found Not coded vop len %lu frame number %u", 506161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen,frame_count); 506261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 50638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Eos and Not coded Vop set len to zero"); 506461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan not_coded_vop = false; 506561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 506661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 507061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_flush_progress == true 5071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 507261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || not_coded_vop 5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 507461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 50758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush in progress return buffer "); 507661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 507761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 507861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 507961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 508061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 508161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate; 508261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 508361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) { 508461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 508561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 508661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 50878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 508861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*for use buffer we need to memcpy the data*/ 508961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer->buffer_len = buffer->nFilledLen; 509061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 509161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer) { 509261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen <= temp_buffer->buffer_len) { 509361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 509461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 509561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 509661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset), 509761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen); 509861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 509961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 510061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 510161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 510261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 510361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 510461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 510561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr = temp_buffer->bufferaddr; 510661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.client_data = (void *) buffer; 510761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.datalen = temp_buffer->buffer_len; 510861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags = 0; 510961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.offset = buffer->nOffset; 511061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_fd = temp_buffer->pmem_fd; 511161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_offset = temp_buffer->offset; 511261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.timestamp = buffer->nTimeStamp; 511361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) { 511461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("ETB: dmx enabled"); 511561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_demux_entries == 0) { 511661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extract_demux_addr_offsets(buffer); 511761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 511861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 511961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries); 512061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle_demux_data(buffer); 512161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr; 512261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size; 512361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 512461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_addr = NULL; 512561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_size = 0; 512661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 512761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 512861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= buffer->nFlags; 5129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 513261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 513361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 51348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 513561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.insert_ts(buffer->nTimeStamp); 513661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 51378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 513861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.insert_ts(buffer->nTimeStamp); 513961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 514061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 514461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (inputBufferFile1) { 514561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fwrite((const char *)temp_buffer->bufferaddr, 514661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer->buffer_len,1,inputBufferFile1); 514761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 515061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { 515161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 515261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 515361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 515461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 515561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 51568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached"); 515761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= VDEC_BUFFERFLAG_EOS; 515861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 515961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count = 0; 516061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 516161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count = 0; 516261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) 516361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 516461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.flush(); 516561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 516661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = 0; 516761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 516861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 516961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 517061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 517161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 517261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&buf, 0, sizeof(buf)); 517361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&plane, 0, sizeof(plane)); 517461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 517561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned long print_count; 517661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 51778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan buf.flags = V4L2_QCOM_BUF_FLAG_EOS; 51788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("INPUT EOS reached") ; 517961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 518061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 518161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = nPortIndex; 518261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 518361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 518461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.bytesused = temp_buffer->buffer_len; 518561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.length = drv_ctx.ip_buf.buffer_size; 518661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.m.userptr = (unsigned long)temp_buffer->bufferaddr - 518761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)temp_buffer->offset; 518861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[0] = temp_buffer->pmem_fd; 518961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[1] = temp_buffer->offset; 519061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.data_offset = 0; 519161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = &plane; 519261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = 1; 519361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frameinfo.timestamp >= LLONG_MAX) { 519461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID; 519561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 519661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //assumption is that timestamp is in milliseconds 519761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.timestamp.tv_sec = frameinfo.timestamp / 1000000; 519861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000); 519961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0; 520061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 520161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 520261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 52038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver"); 520461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 520561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 52068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan codec_config_flag = false; 52078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("%s: codec_config cleared", __FUNCTION__); 52088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 520961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!streaming[OUTPUT_PORT]) { 521061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 521161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret,r; 521261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 521361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 52148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 521561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 521661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ret) { 52178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful"); 521861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[OUTPUT_PORT] = true; 521961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 522061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 52218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT"); 522261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued"); 522361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 522461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 522561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 522661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 522761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 522861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)", 522961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen); 523061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.insert_timestamp(buffer); 5231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 523261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 5233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 523661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 523761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::FillThisBuffer 5238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 523961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 524061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL client uses this method to release the frame buffer 524161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan after displaying them. 5242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 524361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 524461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 524661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 524761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 524961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 525161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5253f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan unsigned nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 525561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 52568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("FTB in Invalid State"); 525761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 525861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 525961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 526061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_bEnabled) { 52618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled."); 526261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 526361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 526461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 526561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || 5266f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (nPortIndex >= drv_ctx.op_buf.actualcount)) { 5267f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u", 5268f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan nPortIndex, drv_ctx.op_buf.actualcount); 526961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 527061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 527161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 527261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) { 52738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex); 527461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 527561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 527661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 527761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 527861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg); 527961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 528261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 528361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::fill_this_buffer_proxy 5284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 528561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 528661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL client uses this method to release the frame buffer 528761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan after displaying them. 5288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 528961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 529061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 529261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 529361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 529561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( 529761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 529861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 5299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 530061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE nRet = OMX_ErrorNone; 530161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 530261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned nPortIndex = 0; 530361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_fillbuffer_cmd fillbuffer; 530461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *ptr_outputbuffer = NULL; 530561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *ptr_respbuffer = NULL; 530661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 530761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 530861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 5309f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) { 5310f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u", 5311f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan nPortIndex, drv_ctx.op_buf.actualcount); 531261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 5313f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 531461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 53158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", 531661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferAdd, bufferAdd->pBuffer); 531761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Return back the output buffer to client*/ 531861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) { 53198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Output Buffers return flush/disable condition"); 532061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 532161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,buffer); 532261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 532361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 532461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers++; 532561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = client_buffers.get_dr_buf_hdr(bufferAdd); 532661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate; 532761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptr_respbuffer) { 532861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data; 532961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 533061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 533161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) { 533261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 533361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 533461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,buffer); 533561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers--; 533661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 533761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 533861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 533961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 534061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 534161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 534261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&buf, 0, sizeof(buf)); 534361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 534461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 534561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 534661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = nPortIndex; 534761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 534861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 534961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].bytesused = buffer->nFilledLen; 535061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 535161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = 535261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr - 535361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset; 535461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 535561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 535661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 535761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 535861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 535961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].bytesused = 0; 536061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 536161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size); 53626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 536361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 53646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 536561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size; 536661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 536761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 53688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index higher than expected: %d", extra_idx); 536961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 537061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 537161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 537261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 537361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 537461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 537561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 537661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to qbuf to driver"); 537761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 537861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 538261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 538361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SetCallbacks 5384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 538661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Set the callbacks. 5387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 538961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 539161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 539261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 539461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 539661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_CALLBACKTYPE* callbacks, 539761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData) 5398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 540061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb = *callbacks; 54018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 540261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EventHandler,m_cb.FillBufferDone); 540361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_app_data = appData; 540461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 5405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 540861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 540961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentDeInit 5410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 541161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 541261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Destroys the component and release memory allocated to the heap. 5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 541461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 541561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 541761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 541861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 5419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 542061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 542461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (iDivXDrmDecrypt) { 5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete iDivXDrmDecrypt; 5426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt=NULL; 5427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 5429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 54306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal unsigned i = 0; 543161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_StateLoaded != m_state) { 54328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\ 543361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state); 54348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Playback Ended - FAILED"); 543561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 54368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Playback Ended - PASSED"); 5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the output buffers have to be cleaned up*/ 544061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 54418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Freeing the Output Memory"); 544261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) { 544361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_output_buffer (&m_out_mem_ptr[i]); 5444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 544561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_ 544661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 544761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 5448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the input buffers have to be cleaned up*/ 545161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr || m_inp_heap_ptr) { 54528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Freeing the Input Memory"); 545361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) { 545461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) 545561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer (i,&m_inp_mem_ptr[i]); 545661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 545761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer (i,NULL); 5458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer_header(); 5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer_header(); 546261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer) { 5463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(h264_scratch.pBuffer); 5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer = NULL; 5465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 546761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_parser) { 5468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete h264_parser; 546961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser = NULL; 5470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 547261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_platform_list) { 5473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_platform_list); 5474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = NULL; 5475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 547661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_vendor_config.pData) { 5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_vendor_config.pData); 5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = NULL; 5479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Reset counters in mesg queues 5482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_size=0; 5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_size=0; 5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_size=0; 5485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_read = m_ftb_q.m_write =0; 5486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_read = m_cmd_q.m_write =0; 5487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_read = m_etb_q.m_write =0; 5488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 548961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 549061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.reset_ts_list(); 5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 54948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG"); 5495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 549661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // NULL); 54978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Close the driver instance"); 54986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 5499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 5500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (inputBufferFile1); 5501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 55036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (outputBufferFile1) 550461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fclose (outputBufferFile1); 5505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 5507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (outputExtradataFile); 5508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 55098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec::component_deinit() complete"); 551061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 551461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 551561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseEGLImage 5516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 551761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 551861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use EGL Image method implementation <TBD>. 5519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 552061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 552161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 552361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 552461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Not Implemented error. 5525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 552661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 552861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 552961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 553061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 553161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN void* eglImage) 5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 553361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list; 553461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry; 553561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info; 5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 553861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc; 553961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan EGLint fd = -1, offset = 0,pmemPtr = 0; 5540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 554161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fd = -1, offset = 0; 5542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 55438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("use EGL image support for decoder"); 554461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) { 55458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR(""); 554661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 554861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_display_id == NULL) { 55498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Display ID is not set by IL client"); 5550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 555161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 555261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC) 555361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eglGetProcAddress("eglQueryImageKHR"); 555461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd); 555561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset); 555661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr); 5557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app 5558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl { 5559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int pmem_fd; 5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int offset; 5561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }; 5562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl *temp_egl_id = NULL; 5563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void * pmemPtr = (void *) eglImage; 5564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_egl_id = (struct temp_egl *)eglImage; 556561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_egl_id != NULL) { 5566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = temp_egl_id->pmem_fd; 5567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev offset = temp_egl_id->offset; 5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (fd < 0) { 55718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd); 5572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 557361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 557461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info.pmem_fd = (OMX_U32) fd; 557561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info.offset = (OMX_U32) offset; 557661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_entry.entry = (void *) &pmem_info; 557761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 557861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list.entryList = &pmem_entry; 557961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list.nEntries = 1; 558061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers = true; 558161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port, 558261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void *)&pmem_list, drv_ctx.op_buf.buffer_size, 558361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *)pmemPtr)) { 55848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("use buffer call failed for egl image"); 558561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 558661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 558761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 559161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 559261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentRoleEnum 5593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 559461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 559561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Component Role Enum method implementation. 5596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 559761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 559861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 560061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 560161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything is successful. 560261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 560461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_U8* role, 560561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 index) 5606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 560761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 5608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 560961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 561061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 561161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 56128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 561361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 561461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 561561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 561761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 561861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 561961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 56208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 562161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 562261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 562361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 562461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 562561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 562661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 56278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 562861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 563061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 563161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 563461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 563561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) ) { 563661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 563761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 56388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 563961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 564161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 564261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 564361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 564461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 564561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 56468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 564761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 564961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 565061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 565161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 565261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 565361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 56548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 565561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 565761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 565861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 565961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 566061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 566161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 566261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 566361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 56648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 566561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 566761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 566861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 566961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 567061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 567161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 56728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 567361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 567561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 567661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 567761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component"); 567961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 56806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 568161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 568861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 568961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateDone 5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 569261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if entire buffer pool is allocated by IL Client or not. 569361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Need this to move to IDLE state. 5694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 569661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 569961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 570161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void) 5703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 570461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 570561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet_In = false; 570661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet_Out = false; 5707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 570861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet_In = allocate_input_done(); 570961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet_Out = allocate_output_done(); 5710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 571161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bRet_In && bRet_Out) { 571261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 571361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 571561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 571861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 571961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateInputDone 5720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 572161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 572261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if I/P buffer pool is allocated by IL Client or not. 5723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 572461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 572561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 572761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 572861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 573061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void) 5732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 573361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 573461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0; 573561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 573661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr == NULL) { 573761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 573861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 573961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr ) { 574061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; i<drv_ctx.ip_buf.actualcount; i++) { 574161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 574261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 574361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == drv_ctx.ip_buf.actualcount) { 574761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 574861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 574961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 575061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) { 575161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated = OMX_TRUE; 575261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 575361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 575661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 575761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateOutputDone 5758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 575961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 576061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if entire O/P buffer pool is allocated by IL Client or not. 5761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 576261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 576361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 576561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 576661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 576861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void) 5770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 577161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 577261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned j=0; 577361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 577461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr == NULL) { 577561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 577661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 577761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 577861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 577961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j < drv_ctx.op_buf.actualcount; j++) { 578061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,j)) { 578161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 578261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 578361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 578461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 578561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 578661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j == drv_ctx.op_buf.actualcount) { 578761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 578861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 578961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_bEnabled) 579061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bPopulated = OMX_TRUE; 579161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 579361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 579761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 579861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseDone 5799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 580161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 580461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 580761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void) 5811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 581261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 5813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 581461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_input_done()) { 581561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 581661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 581761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 581961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 582461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 582561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseOutputDone 5826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 582761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 582861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 583161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 583461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void) 5838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 583961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 584061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0,j=0; 584161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p",m_inp_mem_ptr); 584361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 584461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j < drv_ctx.op_buf.actualcount ; j++) { 584561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_out_bm_count,j)) { 584661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 584761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 584861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 584961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j == drv_ctx.op_buf.actualcount) { 585061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count = 0; 585161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 585261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 585361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 585461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count = 0; 585561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 585661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 585761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 586061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 586161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseInputDone 5862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 586361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 586461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 586661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 586761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 586961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 587061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 587261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void) 5874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 587561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 587661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0,j=0; 587761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 587961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) { 588061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j<drv_ctx.ip_buf.actualcount; j++) { 588161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( BITMASK_PRESENT(&m_inp_bm_count,j)) { 588261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 588361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 588461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 588561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j==drv_ctx.ip_buf.actualcount) { 588661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 588761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 588861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 588961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 589061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 589161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp, 589561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE * buffer) 5896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 589761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 589861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) { 58998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer); 590061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 590161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (output_flush_progress) { 590261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 590361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 590461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp = 0; 590561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 590661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 590761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 590861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 59108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 591161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer); 591261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers --; 5913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 591461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 59158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Output EOS has been reached"); 591661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!output_flush_progress) 591761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event((unsigned)NULL, (unsigned)NULL, 591861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EOS_DONE); 5919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 592061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame) { 592161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 592261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 592361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 592461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 592561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 592661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL, 592761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL); 592861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 592961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 593061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 593161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 59328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("In fill Buffer done call address %p ",buffer); 593361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_BUFFER_LOG 593461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputBufferFile1 && buffer->nFilledLen) { 593561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int buf_index = buffer - m_out_mem_ptr; 593661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int stride = drv_ctx.video_resolution.stride; 593761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int scanlines = drv_ctx.video_resolution.scan_lines; 593861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; 593961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i; 594061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bytes_written = 0; 594161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) { 594261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1); 594361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp += stride; 594461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 594561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines; 594661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int stride_c = stride; 594761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) { 594861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1); 594961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp += stride_c; 595061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 595161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 595361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 595461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* For use buffer we need to copy the data */ 595561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!output_flush_progress) { 595661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.get_next_timestamp(buffer, 595761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 595861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 595961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 596061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 596161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_TICKS expected_ts = 0; 596261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.pop_min_ts(expected_ts); 59638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list", 596461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp, expected_ts); 596561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 596661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nTimeStamp != expected_ts) { 59678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check"); 596861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 596961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 597061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 597261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_cb.FillBufferDone) { 597361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen > 0) { 597461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle_extradata(buffer); 597561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) 597661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep min timestamp interval to handle corrupted bit stream scenario 597761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(buffer->nTimeStamp); 597861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (arbitrary_bytes) 597961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan adjust_timestamp(buffer->nTimeStamp); 598061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 598161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!proc_frms) { 598261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.stop(); 598361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan latency = dec_time.processing_time_us() - latency; 598461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3); 598561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 598661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fps_metrics.start(); 598761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 598861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms++; 598961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 599061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U64 proc_time = 0; 599161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fps_metrics.stop(); 599261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_time = fps_metrics.processing_time_us(); 599361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)", 599461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms, (float)proc_time / 1e6, 599561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)(1e6 * proc_frms) / proc_time); 599661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms = 0; 599761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 599861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 599961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 600061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_EXTRADATA_LOG 600161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputExtradataFile) { 600261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 600361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 600461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) 600561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned)(buffer->pBuffer + buffer->nOffset + 600661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen + 3)&(~3)); 600761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (p_extra && 600861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) { 60098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType); 601061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fwrite (p_extra,1,p_extra->nSize,outputExtradataFile); 601161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p_extra->eType == OMX_ExtraDataNone) { 601261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 601361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 601461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 601561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 601661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 601761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 601861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 601961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 602061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 602161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 602261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 602361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 602461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 602561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((OMX_QCOM_PLATFORM_PRIVATE_LIST *) 602661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->pPlatformPrivate)->entryList->entry; 60278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd); 602861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *il_buffer; 602961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan il_buffer = client_buffers.get_il_buf_hdr(buffer); 603061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (il_buffer) 603161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,il_buffer); 603261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 603361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr"); 603461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 603561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 60368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd); 603761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 603861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 60396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 6040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 604161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp, 604561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* buffer) 6046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 604861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) { 60498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer); 605061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 60538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 605461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer); 6055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_input_buffers--; 6056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 605761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 605861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL && input_flush_progress == false) { 60598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer); 606061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = buffer; 606161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 606261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp = LLONG_MAX; 606361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan push_input_buffer (hComp); 606461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 60658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer); 606661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 606761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)buffer, 606861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 60698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error"); 607061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 607261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_cb.EmptyBufferDone) { 6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 607461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message) 6083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 608461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec* omx = NULL; 608561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo *vdec_msg = NULL; 608661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omxhdr = NULL; 608761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer *v4l2_buf_ptr = NULL; 608861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *output_respbuf = NULL; 608961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc=1; 609061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (context == NULL || message == NULL) { 60918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check"); 609261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 609361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 609461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg = (struct vdec_msginfo *)message; 609561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 609661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = reinterpret_cast<omx_vdec*>(context); 609761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 609861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (vdec_msg->msgcode) { 609961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 610061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_HW_ERROR: 610161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 610261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 610361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 610461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 610561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_START_DONE: 610661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 610761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_START_DONE); 610861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 610961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 611061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_STOP_DONE: 611161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 611261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 611361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 611461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 611561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_RESUME_DONE: 611661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 611761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_RESUME_DONE); 611861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 611961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 612061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_PAUSE_DONE: 612161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 612261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PAUSE_DONE); 612361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 612461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 612561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 612661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 612761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 612861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 612961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 613061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 613161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 613261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 613361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_FLUSHED: 613461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 613561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 613661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* omxhdr = (OMX_BUFFERHEADERTYPE* ) 613761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.input_frame_clientdata; */ 613861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 613961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata; 614061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index; 614161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr == NULL || 614261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) { 614361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr = NULL; 614461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->status_code = VDEC_S_EFATAL; 614561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 614661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 614761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code, 614861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 614961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 615061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_INFO_FIELD_DROPPED: 615161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int64_t *timestamp; 615261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan timestamp = (int64_t *) malloc(sizeof(int64_t)); 615361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (timestamp) { 615461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *timestamp = vdec_msg->msgdata.output_frame.time_stamp; 615561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)timestamp, vdec_msg->status_code, 615661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED); 61578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Field dropped time stamp is %lld", 615861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.time_stamp); 615961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 616061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 616161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_FLUSHED: 616261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 616361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 616461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data; 616561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index; 616661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)", 616761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr, vdec_msg->msgdata.output_frame.time_stamp, 616861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.pic_type); 616961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 617061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr && omxhdr->pOutputPortPrivate && 617161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) && 617261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate 617361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) { 617461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) { 617561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len; 617661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset; 617761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp; 617861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags; 617961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 61808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) { 618161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_EOS; 618261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //rc = -1; 618361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 618461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) { 618561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 618661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 618761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.bufferaddr = 618861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr; 618961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft != 619061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.framesize.left) 619161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || ((unsigned)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))) { 619461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left; 619561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top; 619661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right; 619761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom; 61988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Crop information has changed"); 619961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop, 620061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PORT_RECONFIG); 620161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 620261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf = (struct vdec_output_frameinfo *)\ 620361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->pOutputPortPrivate; 620461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->len = vdec_msg->msgdata.output_frame.len; 620561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->offset = vdec_msg->msgdata.output_frame.offset; 620661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) { 620761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_I; 620861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 620961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) { 621061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_P; 621161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 621261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) { 621361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_B; 621461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 621561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 621661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->output_use_buffer) 621761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ( omxhdr->pBuffer, (void *) 621861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr + 621961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)vdec_msg->msgdata.output_frame.offset), 622061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.len); 622161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 622261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFilledLen = 0; 622361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code, 622461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_FBD); 622561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) 622661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 622761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EOS_DONE); 622861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 622961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 623061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 623161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 623261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_CONFIG_CHANGED: 62338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Port settings changed"); 623461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition, 623561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PORT_RECONFIG); 623661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 623761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_INFO_CONFIG_CHANGED: 623861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 62398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Port settings changed info"); 624061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // get_buffer_req and populate port defn structure 624161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 624261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 624361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret; 624461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 624561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 624661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height); 624761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline; 624861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.scan_lines = fmt.fmt.pix_mp.plane_fmt[0].reserved[0]; 624961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->m_port_def.nPortIndex = 1; 625061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->update_portdef(&(omx->m_port_def)); 625161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 625261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG); 625361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 625461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 625561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 625661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 625761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 625861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 6259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary ( 626261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_HANDLETYPE hComp, 626361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer 626461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 6265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 626661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 62678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Empty this arbitrary"); 626861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 626961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL) { 627061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 627161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 62728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 62738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %d, timestamp %u", 627461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp); 627561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 627661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return zero length and not an EOS buffer */ 627761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return buffer if input flush in progress */ 627861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) && 627961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) { 62808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress"); 628161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,buffer); 628261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 628361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 628461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 628561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame == NULL) { 62868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp); 628761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = buffer; 62888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Try to Push One Input Buffer "); 628961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan push_input_buffer (hComp); 629061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 62918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer); 629261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL, 629361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL)) { 629461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 629561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 629661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 629761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 629861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp) 6303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 630461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 630561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 630661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 630761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL || psource_frame == NULL) { 630861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we have a destination buffer*/ 630961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL) { 63108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get a Destination buffer from the queue"); 631161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 631261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 631361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *)address; 631461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 631561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 63168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame); 631761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 631861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 631961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 632061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we have a destination buffer*/ 632161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame == NULL) { 63228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get a source buffer from the queue"); 632361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 632461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 632561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *)address; 63268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame, 632761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nTimeStamp); 63288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d length %d", 632961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 633061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 633161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 633261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 633361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 633461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 633561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 633661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while ((pdest_frame != NULL) && (psource_frame != NULL)) { 633761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (codec_type_parse) { 633861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_MPEG4: 633961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_H263: 634061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_MPEG2: 634161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_sc_codec(hComp); 634261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 634361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_H264: 634461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_h264(hComp); 634561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 634661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_HEVC: 634761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_hevc(hComp); 634861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 634961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_VC1: 635061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_vc1(hComp); 635161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 635261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 635361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 635461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 635561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret != OMX_ErrorNone) { 63568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pushing input Buffer Failed"); 635761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 635861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 635961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 636061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 636161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 636261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 6363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp) 6366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 636761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 636861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 636961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 6370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 63718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %d", 637261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame,psource_frame->nTimeStamp); 637361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 637461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,&partial_frame) == -1) { 63758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 637661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 637861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 637961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 63808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame size %d source %p frame count %d", 638161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,psource_frame,frame_count); 638261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 638361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 63848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("TimeStamp updated %d",pdest_frame->nTimeStamp); 638561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*First Parsed buffer will have only header Hence skip*/ 638661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frame_count == 0) { 63878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame "); 638861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 638961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_MPEG4 || 639061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse == CODEC_TYPE_DIVX) { 639161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4StreamType psBits; 639261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset; 639361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.numBytes = pdest_frame->nFilledLen; 639461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4_headerparser.parseHeader(&psBits); 639561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 639661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 639761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 639861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 639961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 640061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen) { 640161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 640261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 640361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 640461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 640561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 640661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 640761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 640861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 640961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 641061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 641161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 641261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 641361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) { 64148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Zero len buffer return back to POOL"); 641561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL, 641661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL); 641761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 641861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 641961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 642061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 64218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a Complete Frame %d",pdest_frame->nFilledLen); 642261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 642361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nAllocLen == 642461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen + pdest_frame->nOffset) { 64258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled"); 642661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 642761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 642861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 642961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 643061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen == 0) { 643161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 643261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 643361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags |= psource_frame->nFlags; 64348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x", 643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 64368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a frame size = %d number = %d", 643761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,frame_count++); 643861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 643961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 644061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 644161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 644261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 644361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 644461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 64458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr") ; 644661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 644761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 644861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 644961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd) { 64508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame); 645161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 645261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 645361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 645461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 64558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 645661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 645761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 64588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame, 645961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nTimeStamp); 64608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d length %d", 646161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 646261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 646361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 646461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 646561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp) 6469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 647061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 647161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 647261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL isNewFrame = OMX_FALSE; 647361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 647461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 647561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 64768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated"); 647761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 64798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %d " 648061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal); 64818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 648261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen && look_ahead_nal) { 648361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 648461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 648561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 6486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 6487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer,h264_scratch.nFilledLen); 6488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += h264_scratch.nFilledLen; 64898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame"); 6490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 649161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 64928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264"); 6493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 649561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 649661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length == 0) { 64978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Zero NAL, hence parse using start code"); 649861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 649961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 65008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 6501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 650361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length); 650561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_h264_nallength(psource_frame, 650661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 65078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 650861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 651061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 651261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 651361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 65148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 651561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 651661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 651761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFlags = psource_frame->nFlags; 651861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen); 652061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen) { 652161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen, 652261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NALU_TYPE_SPS); 6523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 652461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) 652561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 652661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, NALU_TYPE_SEI); 652761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 652861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // If timeinfo is present frame info from SEI is already processed 652961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 653061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, NALU_TYPE_SEI); 653161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 653261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 653361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 653461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) { 653561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_last_au_ts; 653661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_last_au_flags; 653761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef PANSCAN_HDLR 653861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 653961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->update_panscan_data(h264_last_au_ts); 654061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 654161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 654261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR || 654361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) { 654461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = h264_scratch.nTimeStamp; 654561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = h264_scratch.nFlags; 654661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 654761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 654861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts); 654961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!VALID_TS(h264_last_au_ts)) 655061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = ts_in_sei; 655161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 655261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 655361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 655461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 655561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 655661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 655761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!isNewFrame) { 655861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 655961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 65608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %d", 656161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen); 656261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 656361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 656461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 656561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ) 656661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 656761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 656861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264"); 657061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 657161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 657261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 657361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = true; 65748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x", 657561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 65768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a frame size = %d number = %d", 657761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,frame_count++); 657861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 657961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen == 0) { 65808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Copy the Current Frame since and push it"); 658161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 658261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 658361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 658461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 658561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 658661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 658761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 658861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264"); 659061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 659161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 659261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 659361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 65948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Reset the EOS Flag"); 659561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 659661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 659761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 659861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 659961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 660061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 660161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //frame_count++; 660261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 660361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 660461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 660561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 66068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame); 660761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 660861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = 0; 660961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 661061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 661161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 661261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 661361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 661461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 661661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 661761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nAllocLen == 661861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen + h264_scratch.nOffset) { 66198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 662061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 6621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 662261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 662361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 662461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!psource_frame->nFilledLen) { 66258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame); 662661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 662761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 662861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 66298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 663061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 663161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 663261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 663361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 663461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 663561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 663661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264"); 663861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 663961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 664061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 664161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 664261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%d TimeStamp = %x", 664461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 66458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++); 664661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 664761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 664861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp); 664961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!VALID_TS(pdest_frame->nTimeStamp)) 665061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = ts_in_sei; 665161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 665361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 665461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 665561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 665661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 665761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 665861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 665961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d", 666161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,h264_scratch.nFilledLen); 666261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 666361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 666461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 666561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 666661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd && !psource_frame->nFilledLen) { 666761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 666861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 666961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 66708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 667161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 667261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 66738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d src length %d", 667461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 667561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 667661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 667761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66806eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc) 6681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 66826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_ERRORTYPE rc = OMX_ErrorNone; 668361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) { 66846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memcpy ((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen); 66858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (pDst->nTimeStamp == LLONG_MAX) { 66866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pDst->nTimeStamp = pSrc->nTimeStamp; 66876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_LOW("Assign Dst nTimeStamp=%lld", pDst->nTimeStamp); 6688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 66896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pDst->nFilledLen += pSrc->nFilledLen; 66906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pSrc->nFilledLen = 0; 669161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Destination buffer overflow"); 66936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rc = OMX_ErrorBadParameter; 6694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 66956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return rc; 6696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66986eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_hevc (OMX_HANDLETYPE hComp) 6699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 670061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 670161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 670261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL isNewFrame = OMX_FALSE; 670361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 670461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE rc = OMX_ErrorNone; 670561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 670661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 67078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated"); 670861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 67096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 671061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 671161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("h264_scratch.nFilledLen %d has look_ahead_nal %d pdest_frame nFilledLen %d nTimeStamp %lld", 671361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 671461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 671561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen && look_ahead_nal) { 671661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 671761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 671861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // copy the lookahead buffer in the scratch 67196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rc = copy_buffer(pdest_frame, &h264_scratch); 672061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc != OMX_ErrorNone) { 672161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 672261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 672361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 672461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length == 0) { 672561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 672661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 67278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 67286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 67296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 673061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length); 673261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_h264_nallength(psource_frame, 673361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 67348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 67356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 673661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 673761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 673861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 673961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 674061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 67418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 674261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 674361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 674461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFlags = psource_frame->nFlags; 674561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen); 674761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen) { 674861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame); 674961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 675061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 675161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 675261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!isNewFrame) { 67538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %d nTimestamp %lld, pdest_frame nFilledLen %d nTimestamp %lld", 675461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 675561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 675661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone) { 675761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 675861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 675961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 676061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = true; 676161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen == 0) { 676261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 67638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer"); 676461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 676561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone ) { 676661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 676761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 676861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 676961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 677061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 677161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 677261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %d nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %d nTimeStamp %lld", 677461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 677561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 677661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 677761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 677861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 677961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 678061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 678161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 67828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pop the next pdest_buffer %p",pdest_frame); 678361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 678461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = 0; 678561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 678661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 678761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 678861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 678961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 679061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %d nTimeStamp %lld, pdest_frame nFilledLen %d nTimeStamp %lld, h264_scratch nFilledLen %d nTimeStamp %lld", 679261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 679361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 679461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 679561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nAllocLen == 679661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen + h264_scratch.nOffset) { 67978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 679861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 679961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 680061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 680161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 680261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!psource_frame->nFilledLen) { 68038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame); 680461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 680561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 680661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 68078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 680861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 680961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone ) { 681061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 681161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 681261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 681361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 681461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 68158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%d TimeStamp = %lld", 681661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count, pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 681761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 681861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 681961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 682061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 682161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 682261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 682361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 682461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d", 682661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,h264_scratch.nFilledLen); 682761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 682861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 682961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 683061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 683161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd && !psource_frame->nFilledLen) { 683261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 683361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 683461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 683561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 683661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 68378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d nFilledLen %d, nTimeStamp %lld", 683861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp); 683961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 684061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 684161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 68426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 68436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68446eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp) 68456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 68466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U8 *buf, *pdest; 68476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U32 partial_frame = 1; 68486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U32 buf_len, dest_len; 68496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 685061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (first_frame == 0) { 68516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal first_frame = 1; 68528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes"); 685361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_vendor_config.pData) { 68548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Check profile type in 1st source buffer"); 68556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buf = psource_frame->pBuffer; 68566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buf_len = psource_frame->nFilledLen; 68576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) == 685961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE) { 68606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_vc1_profile = VC1_SP_MP_RCV; 686161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) { 68626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_vc1_profile = VC1_AP; 686361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer"); 68656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorStreamCorrupt; 68666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 686761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen + 68696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest_frame->nOffset; 68706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen + 687161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nOffset); 68726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 687361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dest_len < m_vendor_config.nDataSize) { 68748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Destination buffer full"); 68756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 687661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize); 68786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest_frame->nFilledLen += m_vendor_config.nDataSize; 68796eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 688361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (m_vc1_profile) { 68846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case VC1_AP: 68858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code"); 688661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (push_input_sc_codec(hComp) != OMX_ErrorNone) { 68878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code"); 68886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 68896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 689061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 68916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case VC1_SP_MP_RCV: 68936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal default: 68948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode"); 68956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 68966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorNone; 68986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 68996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 690061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 690161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 alignment) 690261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 690361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct pmem_allocation allocation; 690461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.size = buffer_size; 690561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align = clip2(alignment); 690661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocation.align < 4096) { 690761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align = 4096; 690861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 690961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) { 69108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)", 691161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align, allocation.size); 691261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 691361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 691461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return true; 691561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 69166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 69176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size, 691861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 alignment, struct ion_allocation_data *alloc_data, 691961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_fd_data *fd_data, int flag) 69206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 692161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fd = -EINVAL; 692261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = -EINVAL; 692361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ion_dev_flag; 692461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ion ion_buf_info; 692561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!alloc_data || buffer_size <= 0 || !fd_data) { 69268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory"); 692761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -EINVAL; 692861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 692961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_dev_flag = O_RDONLY; 693061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = open (MEM_DEVICE, ion_dev_flag); 693161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 69328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd); 693361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return fd; 693461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 693561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags = 0; 693661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (flag & ION_FLAG_CACHED)) { 693761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags |= ION_FLAG_CACHED; 693861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 693961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->len = buffer_size; 694061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->align = clip2(alignment); 694161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (alloc_data->align < 4096) { 694261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->align = 4096; 694361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 694461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((secure_mode) && (flag & ION_SECURE)) 694561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags |= ION_SECURE; 694661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 694761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_ 6948f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan alloc_data->heap_id_mask = ION_HEAP(ION_ADSP_HEAP_ID); 694961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else 6950f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID); 695161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 695261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 6953f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID); 695461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 695561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 695661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc || !alloc_data->handle) { 69578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION ALLOC memory failed "); 695861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->handle = NULL; 695961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(fd); 696061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = -ENOMEM; 696161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return fd; 696261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 696361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd_data->handle = alloc_data->handle; 696461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd,ION_IOC_MAP,fd_data); 696561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 69668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION MAP failed "); 696761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.ion_alloc_data = *alloc_data; 696861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.ion_device_fd = fd; 696961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.fd_ion_data = *fd_data; 697061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&ion_buf_info); 697161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd_data->fd =-1; 697261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = -ENOMEM; 697361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 697461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 6976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 697861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) 6979dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{ 698061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 698161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!buf_ion_info) { 69828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata"); 698361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 698461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 698561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 698661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &buf_ion_info->ion_alloc_data.handle)) { 69878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION: free failed" ); 698861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 698961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(buf_ion_info->ion_device_fd); 699061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->ion_device_fd = -1; 699161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->ion_alloc_data.handle = NULL; 699261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->fd_ion_data.fd = -1; 6993dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand} 6994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header() 6996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 69978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("ALL output buffers are freed/released"); 699861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_use_buffer = false; 699961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers = false; 700061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 700161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 700261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_out_mem_ptr); 700361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 700461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 700561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 700661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_platform_list) { 700761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_platform_list); 700861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = NULL; 700961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 701061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 701161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 701261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_respbuffer); 701361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 701461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 701561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 701661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_outputbuffer); 701761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 701861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 70218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 702261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header() 7029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_use_buffer = false; 703161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 703261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) { 70338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free utils parser"); 703461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan delete (m_frame_parser.mutils); 703561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils = NULL; 703661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 703761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 703861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr) { 70398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input Heap Pointer"); 704061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_inp_heap_ptr); 704161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = NULL; 704261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 704361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 704461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) { 70458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input pmem header Pointer"); 704661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_phdr_pmem_ptr); 704761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = NULL; 704861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 704961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 705061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) { 70518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input pmem Pointer area"); 705261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_inp_mem_ptr); 705361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr = NULL; 705461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 705561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer) { 70568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Driver Context pointer"); 705761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_inputbuffer); 705861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer = NULL; 7059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ip_buf_ion_info) { 70628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ion context"); 706361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ip_buf_ion_info); 7064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info = NULL; 7065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 70686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 70696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::stream_off(OMX_U32 port) 7070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 707161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type btype; 707261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 707361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_ports v4l2_port = OUTPUT_PORT; 707461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 707561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 707661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 707761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_port = OUTPUT_PORT; 707861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 707961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 708061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_port = CAPTURE_PORT; 708161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_ALL) { 708261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX); 708361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 708461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 708561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!rc_input) 708661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc_input; 708761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 708861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc_output; 708961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 709061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 709161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!streaming[v4l2_port]) { 709261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // already streamed off, warn and move on 709361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port," 709461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " which is already streamed off", v4l2_port); 709561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 0; 709661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 709761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 709861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port); 709961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 710061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype); 710161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 710261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 71038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port); 710461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 710561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[v4l2_port] = false; 710661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 710761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 710861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 710961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 711061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 711161a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop) 711261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 711361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 711461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 711561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0; 711661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 711761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret = 0; 711861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 711961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 712061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = 1; 712161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 712261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 712361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 712461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 712561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 712661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 712761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 712861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 712961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 713061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 713161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 713261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet==OMX_ErrorNone) { 713361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 713461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 713561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 713661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 713761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 713861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 713961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 714061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 714161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount = bufreq.count; 714261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->mincount = bufreq.count; 71438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Count = %d",bufreq.count); 714461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 714561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)", 714661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type); 714761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 714861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 714961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 715061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 715161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 715261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 715361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height); 715461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 715561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes; 71568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage); 715761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 715861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 715961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 716061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 716161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 716261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 716361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 716461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 716561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = buffer_prop->buffer_size; 716661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 716761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 716861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 716961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 71708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 717161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 717261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 717361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_FRAMEINFO_EXTRADATA) { 717461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Frame info extra data enabled!"); 717561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE; 717661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 717761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_INTERLACE_EXTRADATA) { 717861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE; 717961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 718061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_PORTDEF_EXTRADATA) { 718161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE; 71828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d", 718361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size); 718461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 718561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extra_data_size) { 718661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator 718761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit 718861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 718961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size; 719061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.count = buffer_prop->actualcount; 719161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.buffer_size = extra_data_size; 719261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size += client_extra_data_size; 719361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 719461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)", 719561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type); 719661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (in_reconfig) // BufReq will be set to driver when port is disabled 719761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = buf_size; 719861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (buf_size != buffer_prop->buffer_size) { 719961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = buf_size; 720061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(buffer_prop); 720161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 720261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 72038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)", 720461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type); 720561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 720861a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop) 720961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 721061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 721161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned buf_size = 0; 721261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 721361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 721461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret; 721561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)", 721661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size); 721761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 721861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_size != buffer_prop->buffer_size) { 721961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)", 722061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size, buf_size); 722161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 722261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 722361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 722461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 722561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 722661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 722761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 722861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 722961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 723061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 723161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 723261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 723361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 723461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 723561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 723661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 723761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 723861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 723961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret); 724061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 724161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 724261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 724361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 724461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = buffer_prop->actualcount; 724561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 724661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 724761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 724861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 724961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 725061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 725161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 725361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet==OMX_ErrorNone) { 725461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 725561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 725661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 725761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 725861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret); 725961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 726061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 726161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (bufreq.count < buffer_prop->actualcount) { 726261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Driver refused to change the number of buffers" 726361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " on v4l2 port %d to %d (prefers %d)", bufreq.type, 726461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, bufreq.count); 726561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 726661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 726761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.update_buffer_req()) { 726861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed"); 726961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 727061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 727161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 727261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 727361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!eRet && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 727461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // need to update extradata buffers also 727561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size; 727661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.count = buffer_prop->actualcount; 727761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 727861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7279dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand} 7280dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 7281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution() 7282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 728361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 728461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 7288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 728961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 729061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!portDefn) { 729161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 729261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 72938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("omx_vdec::update_portdef"); 729461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 729561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nSize = sizeof(portDefn); 729661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDomain = OMX_PortDomainVideo; 729761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator > 0) 729861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator / 729961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator; 730061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 73018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Divide by zero"); 730261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 7303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 730461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portDefn->nPortIndex) { 730561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirInput; 730661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 730761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 730861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 730961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused; 731061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eCompressionFormat = eCompressionFormat; 731161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bEnabled = m_inp_bEnabled; 731261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bPopulated = m_inp_bPopulated; 731361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (1 == portDefn->nPortIndex) { 731461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buf_size = 0; 731561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.update_buffer_req()) { 73168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed"); 731761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 731861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 731961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_buffer_req(buf_size)) { 73208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("update buffer requirements"); 732161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 732261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 732361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize = buf_size; 732461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirOutput; 732561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 732661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 732761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 732861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bEnabled = m_out_bEnabled; 732961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bPopulated = m_out_bPopulated; 733061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) { 73318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error in getting color format"); 733261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 733361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 733461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 733561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirMax; 733661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 733761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->nPortIndex); 733861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 733961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 734061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height; 734161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width; 734261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride = drv_ctx.video_resolution.stride; 734361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines; 734461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld" 73458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " SliceHeight = %lu", portDefn->format.video.nFrameWidth, 734661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight, 734761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride, 734861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight); 734961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers() 7354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 735561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 735661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr = NULL; 735761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; 735861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 735961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 73608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation"); 736161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nBufHdrSize = 0; 736261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformEntrySize = 0; 736361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformListSize = 0; 736461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPMEMInfoSize = 0; 736561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 736661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 736761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 736861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 73698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Setting First Output Buffer(%d)", 737061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 737161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufHdrSize = drv_ctx.op_buf.actualcount * 737261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE); 737361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 737461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize = drv_ctx.op_buf.actualcount * 737561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 737661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize = drv_ctx.op_buf.actualcount * 737761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 737861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformEntrySize = drv_ctx.op_buf.actualcount * 737961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 738061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 73818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize, 738261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE), 738361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize, 738461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize); 73858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PE %d bmSize %d",nPlatformEntrySize, 738661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count); 738761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 738861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Alloc mem for platform specific info 738961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *pPtr=NULL; 739061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 739161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize,1); 739261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \ 739361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_bufferpayload), 739461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 739561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 739661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo), 739761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 7398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 739961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \ 740061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount); 7401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 740361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 740461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_respbuffer) { 740561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr = m_out_mem_ptr; 740661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 740761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 740861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_list) + nPlatformListSize); 740961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 741061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_entry) + nPlatformEntrySize); 741161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList = m_platform_list; 741261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry = m_platform_entry; 741361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = m_pmem_info; 741461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 74158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 741661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 741761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Settting the entire storage nicely 74188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, 741961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr,pPlatformEntry); 74208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 742161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 742261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 742361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 742461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Set the values when we determine the right HxW param 742561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nAllocLen = 0; 742661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nFilledLen = 0; 742761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pAppPrivate = NULL; 742861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 742961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 743061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->entry = pPMEMInfo; 743161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform List 743261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->nEntries = 1; 743361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->entryList = pPlatformEntry; 743461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep pBuffer NULL till vdec is opened 743561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pBuffer = NULL; 743661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->offset = 0; 743761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->pmem_fd = 0; 743861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pPlatformPrivate = pPlatformList; 743961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 7440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 744161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 7442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 744361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create a mapping between buffers*/ 744461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 744561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 744661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ptr_outputbuffer[i]; 744761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the buffer and buffer header pointers 744861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr++; 744961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo++; 745061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry++; 745161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList++; 745261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 745361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 74548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 745561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr, pPtr); 745661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 745761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_out_mem_ptr); 745861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 745961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 746061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pPtr) { 746161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(pPtr); 746261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = NULL; 746361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 746461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 746561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_outputbuffer); 746661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 746761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 746861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 746961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_respbuffer); 747061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 747161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 747361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info) { 74748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 747561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 747661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = NULL; 747761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 747961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 748061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 748161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 748261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 7483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 748461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs() 7488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 748961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1; 749061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2; 749161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident; 749261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_cmd_queue tmp_q, pending_bd_q; 749361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 749461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // pop all pending GENERATE FDB from ftb queue 749561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_ftb_q.m_size) { 749661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.pop_entry(&p1,&p2,&ident); 749761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_FBD) { 749861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.insert_entry(p1,p2,ident); 749961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 750061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.insert_entry(p1,p2,ident); 750161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 750361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //return all non GENERATE FDB to ftb queue 750461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (tmp_q.m_size) { 750561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.pop_entry(&p1,&p2,&ident); 750661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.insert_entry(p1,p2,ident); 750761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 750861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // pop all pending GENERATE EDB from etb queue 750961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_etb_q.m_size) { 751061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 751161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_EBD) { 751261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.insert_entry(p1,p2,ident); 751361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 751461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.insert_entry(p1,p2,ident); 751561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 751661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 751761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //return all non GENERATE FDB to etb queue 751861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (tmp_q.m_size) { 751961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.pop_entry(&p1,&p2,&ident); 752061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.insert_entry(p1,p2,ident); 752161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 752261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 752361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // process all pending buffer dones 752461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (pending_bd_q.m_size) { 752561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.pop_entry(&p1,&p2,&ident); 752661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (ident) { 752761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EBD: 752861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 75298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!"); 753061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 753161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 753261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 753361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 753461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FBD: 753561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 75368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!"); 753761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 753861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 753961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 754061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp) 7545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 754661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 new_frame_interval = 0; 754761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 754861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) { 754961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan new_frame_interval = (act_timestamp > prev_ts)? 755061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp - prev_ts : 755161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts - act_timestamp; 755261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (new_frame_interval < frm_int || frm_int == 0) { 755361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = new_frame_interval; 755461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frm_int) { 755561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 1e6; 755661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = frm_int; 755761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)", 755861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int, drv_ctx.frame_rate.fps_numerator / 755961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)drv_ctx.frame_rate.fps_denominator); 756061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 756161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 756261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 756361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 7564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp) 7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 756861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rst_prev_ts && VALID_TS(act_timestamp)) { 756961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 757061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = false; 757161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (VALID_TS(prev_ts)) { 757261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool codec_cond = (drv_ctx.timestamp_adjust)? 757361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)? 757461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)): 757561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!VALID_TS(act_timestamp) || act_timestamp == prev_ts); 757661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frm_int > 0 && codec_cond) { 757761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 757861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp = prev_ts + frm_int; 757961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 758061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 758161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 758261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(act_timestamp); 758361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (frm_int > 0) // In this case the frame rate was set along 758461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { // with the port definition, start ts with 0 758561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 758661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 7587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 7591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 759261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL; 759361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_conceal_MB = 0; 759461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 frame_rate = 0; 759561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int consumed_len = 0; 759661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_MB_in_frame; 759761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 recovery_sei_flags = 1; 759861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int buf_index = p_buf_hdr - m_out_mem_ptr; 759961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_panscan_window_payload *panscan_payload = NULL; 760061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) + 760161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nOffset; 760261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.extradata_info.uaddr) { 760361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 760461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 760561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) 760661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3)); 760761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size; 760861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen)) 760961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = NULL; 761061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata; 761161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (data) { 761261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while ((consumed_len < drv_ctx.extradata_info.buffer_size) 76138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) { 761461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) { 761561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Invalid extra data size"); 761661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 761761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 761861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)data->eType) { 76198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO: 762061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_interlace_payload *payload; 762161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan payload = (struct msm_vidc_interlace_payload *)data->data; 76228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (payload->format != MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) { 762361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int enable = 1; 762461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 mbaff = 0; 762561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mbaff = (h264_parser)? (h264_parser->is_mbaff()): false; 76268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((payload->format == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) && !mbaff) 762761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 762861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 762961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 763061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) 763161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 763261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PP_PARAM_INTERLACED, (void*)&enable); 763361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 763461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) { 763561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_interlace_extradata(p_extra, payload->format); 763661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 763761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 763861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_FRAME_RATE: 764061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_framerate_payload *frame_rate_payload; 764161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data; 764261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_rate = frame_rate_payload->frame_rate; 764361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_TIMESTAMP: 764561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_ts_payload *time_stamp_payload; 764661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_payload = (struct msm_vidc_ts_payload *)data->data; 764761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo; 764861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32); 764961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB: 765161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_concealmb_payload *conceal_mb_payload; 765261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data; 765361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 765461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_height + 15)) >> 8; 765561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0); 765661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_ASPECT_RATIO: 765861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload; 765961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)data->data; 766061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((struct vdec_output_frameinfo *) 766161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width; 766261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((struct vdec_output_frameinfo *) 766361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height; 766461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI: 766661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_recoverysei_payload *recovery_sei_payload; 766761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data; 766861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan recovery_sei_flags = recovery_sei_payload->flags; 76698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) { 767061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 76718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received"); 767261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 767361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW: 767561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data; 767661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 767761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 767861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto unrecognized_extradata; 767961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 768061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan consumed_len += data->nSize; 768161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 768261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 768361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 768461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 768561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_frame_info_extradata(p_extra, 768661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate, 768761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_payload,&((struct vdec_output_frameinfo *) 768861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info); 768961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 769061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 76916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunrecognized_extradata: 769261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && client_extradata) 769361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_terminator_extradata(p_extra); 769461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 76976eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, 769861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool is_internal, bool enable) 7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 770061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 770161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 770261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state != OMX_StateLoaded) { 770361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 770461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 770561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 77068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d", 770761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata, requested_extradata, enable, is_internal); 770861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 770961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!is_internal) { 771061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enable) 771161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata |= requested_extradata; 771261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 771361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata = client_extradata & ~requested_extradata; 771461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 771561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 771661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enable) { 771761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (requested_extradata & OMX_INTERLACE_EXTRADATA) { 771861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 771961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO; 772061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 772161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set interlaced extradata." 77228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Quality of interlaced clips might be impacted."); 772361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 772461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) { 772561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 772661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE; 772761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set framerate extradata"); 772961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 773061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 773161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB; 773261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set concealed MB extradata"); 773461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 773561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 773661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI; 773761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata"); 773961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 774061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 774161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW; 774261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 774461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 774561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 77468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO; 774761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 774961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 775061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) { 775161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 775261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP; 775361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set timeinfo extradata"); 775561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 775661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 775761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 775861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = get_buffer_req(&drv_ctx.op_buf); 775961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 776461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0; 776561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *data_ptr = extra->data, data = 0; 776661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (byte_count < extra->nDataSize) { 776761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data = *data_ptr; 776861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (data) { 776961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB += (data&0x01); 777061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data >>= 1; 777161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 777261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data_ptr++; 777361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan byte_count++; 777461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 777561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 777661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_height + 15)) >> 8; 777761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0); 7778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 778261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_debug_extradata) 778361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 778661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "============== Extra Data ==============\n" 778761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Size: %lu \n" 778861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Version: %lu \n" 778961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " PortIndex: %lu \n" 779061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Type: %x \n" 77918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " DataSize: %lu", 779261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize, extra->nVersion.nVersion, 779361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex, extra->eType, extra->nDataSize); 779461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 779561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) { 779661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data; 779761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 779861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "------ Interlace Format ------\n" 779961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Size: %lu \n" 780061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Version: %lu \n" 780161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " PortIndex: %lu \n" 780261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Is Interlace Format: %d \n" 780361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Interlace Formats: %lu \n" 78048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "=========== End of Interlace ===========", 780561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex, 780661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan intfmt->bInterlaceFormat, intfmt->nInterlaceFormats); 780761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) { 780861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 780961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 781061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 781161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "-------- Frame Format --------\n" 781261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Picture Type: %d \n" 781361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Interlace Type: %d \n" 781461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Pan Scan Total Frame Num: %lu \n" 781561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Concealed Macro Blocks: %lu \n" 781661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " frame rate: %lu \n" 781761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Aspect Ratio X: %lu \n" 78188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Aspect Ratio Y: %lu", 781961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->ePicType, 782061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->interlaceType, 782161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->panScan.numWindows, 782261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->nConcealedMacroblocks, 782361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->nFrameRate, 782461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->aspectRatio.aspectRatioX, 782561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->aspectRatio.aspectRatioY); 782661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 782761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) { 782861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 782961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "------------------------------\n" 783061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Pan Scan Frame Num: %lu \n" 783161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Rectangle x: %ld \n" 783261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Rectangle y: %ld \n" 783361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Rectangle dx: %ld \n" 78348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Rectangle dy: %ld", 783561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y, 783661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy); 783761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 783861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 783961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("========= End of Frame Format =========="); 784061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra->eType == OMX_ExtraDataNone) { 784161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("========== End of Terminator ==========="); 784261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 784361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("======= End of Driver Extradata ========"); 784461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 784861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 interlaced_format_type) 7849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 785061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STREAMINTERLACEFORMAT *interlace_format; 785161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 mbaff = 0; 785261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) { 785361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 785461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 785561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE; 785661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 785761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 785861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat; 785961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT); 786061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data; 786161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT); 786261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nVersion.nVersion = OMX_SPEC_VERSION; 786361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 786461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mbaff = (h264_parser)? (h264_parser->is_mbaff()): false; 78658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) && !mbaff) { 786661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->bInterlaceFormat = OMX_FALSE; 786761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 786861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 786961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 787061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->bInterlaceFormat = OMX_TRUE; 787161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; 787261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 787361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 787461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 78776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::fill_aspect_ratio_info( 787861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_aspectratioinfo *aspect_ratio_info, 787961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info) 78806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 788161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata = frame_info; 788261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width; 788361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height; 788461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX, 788561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioY); 78866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 7887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 788961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate, 78906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct msm_vidc_panscan_window_payload *panscan_payload, 78916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct vdec_aspectratioinfo *aspect_ratio_info) 7892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 789361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL; 789461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_panscan_window *panscan_window; 789561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 78966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return; 789761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 789861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE; 789961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 790061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 790161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo; 790261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO); 790361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 790461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (picture_type) { 790561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_I: 790661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeI; 790761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 790861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_P: 790961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeP; 791061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 791161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_B: 791261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeB; 791361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 791461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 791561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0; 791661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 791761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 791861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 791961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 792061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 792161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 792261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive; 792361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio)); 792461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->nConcealedMacroblocks = num_conceal_mb; 792561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->nFrameRate = frame_rate; 792661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.numWindows = 0; 792761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (panscan_payload) { 792861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.numWindows = panscan_payload->num_panscan_windows; 792961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_window = &panscan_payload->wnd[0]; 793061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) { 793161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].x = panscan_window->panscan_window_width; 793261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].y = panscan_window->panscan_window_height; 793361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset; 793461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset; 793561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_window++; 793661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 793761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 793861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fill_aspect_ratio_info(aspect_ratio_info, frame_info); 793961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 794461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL; 794561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE; 794661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 794761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 794861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef; 794961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 795061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data; 795161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *portDefn = m_port_def; 795261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u" 79538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "sliceheight = %u",portDefn->format.video.nFrameHeight, 795461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth, 795561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride, 795661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight); 7957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 796161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_extradata) { 796261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 796361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 796461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE); 796561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 796661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = OMX_ExtraDataNone; 796761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = 0; 796861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->data[0] = 0; 796961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 797061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index) 7974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 797561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 797661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= drv_ctx.ip_buf.actualcount) { 79778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found"); 797861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 797961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 798061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 798161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr = (desc_buffer_hdr*) \ 798261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(desc_buffer_hdr)), 798361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 798461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 79858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed "); 798661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 798761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 798861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 798961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 799061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8)); 799161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr[index].buf_addr == NULL) { 79928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("desc buffer Allocation failed "); 799361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 799461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 799561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 799661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset) 8000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 800161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries); 800261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_demux_entries < 8192) { 800361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_offsets[m_demux_entries++] = address_offset; 800461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 800561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 8006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr) 8009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 801061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 bytes_to_parse = buf_hdr->nFilledLen; 801161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset; 801261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 index = 0; 801361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 801461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 801561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 801661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (index < bytes_to_parse) { 801761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 801861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) || 801961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 802061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buf[index+2] == 0x01)) ) { 802161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Found start code, insert address offset 802261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan insert_demux_addr_offset(index); 802361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf[index+2] == 0x01) // 3 byte start code 802461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += 3; 802561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else //4 byte start code 802661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += 4; 802761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 802861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index++; 8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 803061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries); 803161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr) 8035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 803661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //fix this, handle 3 byte start code, vc1 terminator entry 803761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *p_demux_data = NULL; 803861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 desc_data = 0; 803961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 start_addr = 0; 804061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 nal_size = 0; 804161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 suffix_byte = 0; 804261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 demux_index = 0; 804361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 buffer_index = 0; 804461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 804561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 804661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries."); 804761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 804861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 804961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 805061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 805161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_index > drv_ctx.ip_buf.actualcount) { 805261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index); 805361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 805461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 805561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 805661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr; 805761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 805861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( ((OMX_U8*)p_demux_data == NULL) || 805961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) { 806061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries."); 806161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 806261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 806361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; demux_index < m_demux_entries; demux_index++) { 806461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0; 806561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan start_addr = m_demux_offsets[demux_index]; 806661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) { 806761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3]; 806861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 806961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4]; 807061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 807161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (demux_index < (m_demux_entries - 1)) { 807261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2; 807361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 807461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2; 807561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 807661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)", 807761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan start_addr, 807861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte, 807961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size, 808061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan demux_index); 808161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = (start_addr >> 3) << 1; 808261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data |= (start_addr & 7) << 21; 808361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data |= suffix_byte << 24; 808461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 808561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 808661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32)); 808761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 808861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 808961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 809061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data += 16; 809161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 809261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_VC1) { 809361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("VC1 terminator entry"); 809461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0; 809561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0x82 << 24; 809661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 809761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 4, 0, sizeof(OMX_U32)); 809861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 809961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 810061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data += 16; 810161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries++; 810261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 810361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Add zero word to indicate end of descriptors 810461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data, 0, sizeof(OMX_U32)); 810561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 810661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32); 810761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size); 810861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 810961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 811061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 811161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Demux table complete!"); 811261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 8113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 81156eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::createDivxDrmContext() 8116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 811761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE err = OMX_ErrorNone; 811861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan iDivXDrmDecrypt = DivXDrmDecrypt::Create(); 811961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (iDivXDrmDecrypt) { 812061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE err = iDivXDrmDecrypt->Init(); 812161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (err!=OMX_ErrorNone) { 81228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR :iDivXDrmDecrypt->Init %d", err); 8123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete iDivXDrmDecrypt; 8124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt = NULL; 812561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 812661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 81278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unable to Create DIVX DRM"); 812861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan err = OMX_ErrorUndefined; 812961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 813061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return err; 8131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 81326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf() 81346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 813561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 813661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = NULL; 813761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_members(); 813861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat = OMX_COLOR_FormatMax; 81396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client) 81426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 814361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = reinterpret_cast<omx_vdec*>(client); 81446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 814661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members() 814761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 814861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count = 0; 814961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = 0; 815061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = 0; 815161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_platform_list_client,0,sizeof(m_platform_list_client)); 815261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_platform_entry_client,0,sizeof(m_platform_entry_client)); 815361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_pmem_info_client,0,sizeof(m_pmem_info_client)); 815461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client)); 81556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 815661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(op_buf_ion_info,0,sizeof(m_platform_entry_client)); 81576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 815861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (int i = 0; i < MAX_COUNT; i++) 815961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[i] = -1; 81606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 816261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() 816361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 816461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 81656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::update_buffer_req() 81686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 816961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 817061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int src_size = 0, destination_size = 0; 817161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE drv_color_format; 817261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 81738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid client in color convert"); 817461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 817561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 817661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 81778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("No color conversion required"); 817861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 817961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 818061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 818161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 && 818261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat != OMX_COLOR_FormatYUV420Planar) { 81838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion"); 818461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 818561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto fail_update_buf_req; 818661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 818761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 818861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.open(omx->drv_ctx.video_resolution.frame_height, 818961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.frame_width, 819061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NV12_128m,YCbCr420P); 819161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) { 819261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.get_buffer_size(C2D_INPUT,src_size); 819361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) 819461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.get_buffer_size(C2D_OUTPUT,destination_size); 819561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 819661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) { 819761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size || 819861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !destination_size) { 81998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d" 820061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "driver size %d destination size %d", 820161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan src_size,omx->drv_ctx.op_buf.buffer_size,destination_size); 820261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 820361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 820461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = 0; 820561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 820661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = destination_size; 820761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size) 820861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = omx->drv_ctx.op_buf.buffer_size; 820961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 821061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 821161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 82126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 82136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_update_buf_req: 821461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 821561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 82166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 82186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::set_color_format( 821961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE dest_color_format) 82206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 822161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 822261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE drv_color_format; 822361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 82248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid client in color convert"); 822561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 822661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 822761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 822861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 822961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_color_format = (OMX_COLOR_FORMATTYPE) 823061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 823161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 82328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Incorrect color format"); 82336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal status = false; 82346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 823561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status && (drv_color_format != dest_color_format)) { 82368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Enabling C2D"); 823761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dest_color_format != OMX_COLOR_FormatYUV420Planar) { 82388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unsupported color format for c2d"); 823961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 824061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 824161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat = OMX_COLOR_FormatYUV420Planar; 824261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled) 824361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 824461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 824561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!c2d.init()) { 82468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for c2d"); 824761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 824861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 824961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = true; 825061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 825161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 825261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled) 825361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 825461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 825561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 825661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 825761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 82586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 82606eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr() 82616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 826261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 82638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 826461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 826561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 826661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 826761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->m_out_mem_ptr; 826861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return m_out_mem_ptr_client; 82696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 827161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr 827261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd) 82736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 827461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 82758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 827661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 827761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 827861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 827961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bufadd; 828061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 828161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned index = 0; 828261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufadd - omx->m_out_mem_ptr; 828361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < omx->drv_ctx.op_buf.actualcount) { 828461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS); 828561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp; 828661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status; 828761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) { 828861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 828961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd, 829061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index], 829161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[index], pmem_baseaddress[index]); 829261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 829361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = buffer_size_req; 829461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!status) { 82958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed color conversion %d", status); 829661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = 0; 829761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return &m_out_mem_ptr_client[index]; 829861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 829961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 830061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = 0; 83016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return &m_out_mem_ptr_client[index]; 830261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr"); 830461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 83056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 83066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 830761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr 830861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd) 83096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 831061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 83118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 831261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 831361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 831461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 831561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bufadd; 831661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned index = 0; 831761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufadd - m_out_mem_ptr_client; 831861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < omx->drv_ctx.op_buf.actualcount) { 831961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return &omx->m_out_mem_ptr[index]; 832061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr"); 83226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return NULL; 83236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 832461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool omx_vdec::allocate_color_convert_buf::get_buffer_req 832561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(unsigned int &buffer_size) 83266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 832761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 832861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 832961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 833061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size = omx->drv_ctx.op_buf.buffer_size; 833161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 833261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) { 83338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get buffer size failed"); 833461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 833561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto fail_get_buffer_size; 833661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 833761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 833861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_size < omx->drv_ctx.op_buf.buffer_size) 83396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buffer_size = omx->drv_ctx.op_buf.buffer_size; 834061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 834161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 83426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_get_buffer_size: 834361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 834461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 83456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 83466eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer( 834761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufhdr) 834861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 834961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 835061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 835161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 835261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->free_output_buffer(bufhdr); 835361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled && omx->is_component_secure()) 835461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 835561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!allocated_count || !bufhdr) { 83568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr); 835761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 835861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 835961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufhdr - m_out_mem_ptr_client; 836061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= omx->drv_ctx.op_buf.actualcount) { 83618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer"); 836261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 836361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 836461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd[index] > 0) { 836561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap(pmem_baseaddress[index], buffer_size_req); 836661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd[index]); 836761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 836861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[index] = -1; 83696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 837061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->free_ion_memory(&op_buf_ion_info[index]); 8371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 837261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr[index].video_heap_ptr = NULL; 837361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocated_count > 0) 837461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count--; 837561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 837661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count = 0; 837761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!allocated_count) { 837861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 837961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 838061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_members(); 838161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 838261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 838361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->free_output_buffer(&omx->m_out_mem_ptr[index]); 83846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 8385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 83866eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 838761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes) 83886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 838961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 839061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 839161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 839261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 839361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 839461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled && omx->is_component_secure()) { 83958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d", 839661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->is_component_secure()); 839761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUnsupportedSetting; 839861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 839961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!bufferHdr || bytes > buffer_size_req) { 84008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr); 84018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("color_convert buffer_size_req %d bytes %lu", 840261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req,bytes); 840361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 840461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 840561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocated_count >= omx->drv_ctx.op_buf.actualcount) { 84068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert"); 840761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 840861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 840961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL; 841061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr, 841161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan port,appData,omx->drv_ctx.op_buf.buffer_size); 841261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone || !temp_bufferHdr) { 84138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Buffer allocation failed color_convert"); 841461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 841561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 841661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((temp_bufferHdr - omx->m_out_mem_ptr) >= 841761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.op_buf.actualcount) { 84188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid header index %d", 841961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (temp_bufferHdr - omx->m_out_mem_ptr)); 842061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUndefined; 842161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 842261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int i = allocated_count; 84236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 842461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory( 842561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req,buffer_alignment_req, 842661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data, 842761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 0); 842861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd; 842961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (op_buf_ion_info[i].ion_device_fd < 0) { 84308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert"); 843161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 843261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 843361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req, 843461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0); 843561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 843661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_baseaddress[i] == MAP_FAILED) { 84378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req); 843861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd[i]); 843961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->free_ion_memory(&op_buf_ion_info[i]); 844061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 844161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 844261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr[i].video_heap_ptr = new VideoHeap ( 844361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_buf_ion_info[i].ion_device_fd,buffer_size_req, 844461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]); 84456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 844661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get(); 844761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info_client[i].offset = 0; 844861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i]; 844961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 845061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list_client[i].nEntries = 1; 845161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list_client[i].entryList = &m_platform_entry_client[i]; 845261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pOutputPortPrivate = NULL; 845361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nAllocLen = buffer_size_req; 845461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nFilledLen = 0; 845561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nFlags = 0; 845661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 845761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE); 845861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION; 845961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i]; 846061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i]; 846161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pAppPrivate = appData; 846261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = &m_out_mem_ptr_client[i]; 84638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("IL client buffer header %p", *bufferHdr); 846461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count++; 846561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 84666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 84676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 84686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::is_component_secure() 84696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 847061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return secure_mode; 84716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 84726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 84736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format) 84746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 847561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 847661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 847761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 847861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dest_color_format = (OMX_COLOR_FORMATTYPE) 847961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 848061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 848161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 848261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 848361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ColorFormat != OMX_COLOR_FormatYUV420Planar) { 848461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 848561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 848661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dest_color_format = OMX_COLOR_FormatYUV420Planar; 848761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 848861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 84896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 8490