1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*-------------------------------------------------------------------------- 26eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalCopyright (c) 2013, 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 94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30 95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR DEFAULT_FPS 96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120 97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE 0xC5000000 99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK 0xFF000000 100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE 0x0F010000 101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK 0xF0 102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK 0xE0000000 103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE 0 104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE 1 105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE 3 106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL 0 107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL 2 108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN 4 109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS 8 110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS 12 111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS 24 112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE 36 1136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define POLL_TIMEOUT 0x7fffffff 114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion" 116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_HEAP_ID ION_CP_MM_HEAP_ID 117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 11961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" { 12061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include<utils/Log.h> 12161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_ 123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_4K 0x1000 1256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_1M 0x100000 1266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } } 128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); } 1296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define EXTRADATA_IDX(__num_planes) (__num_planes - 1) 130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA) 132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input) 133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 13461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer; 13561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 13661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct pollfd pfd; 13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer v4l2_buf; 13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event dqevent; 14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec *omx = reinterpret_cast<omx_vdec*>(input); 14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pfd.fd = omx->drv_ctx.video_driver_fd; 14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0; 14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n"); 14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0); 14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = poll(&pfd, 1, POLL_TIMEOUT); 14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!rc) { 14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Poll timedout\n"); 15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (rc < 0) { 15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Error while polling: %d\n", rc); 15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) { 15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.memory = V4L2_MEMORY_USERPTR; 15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.length = omx->drv_ctx.num_planes; 16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.m.planes = plane; 16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) { 16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.len=plane[0].bytesused; 16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr; 16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) + 16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (uint64_t)v4l2_buf.timestamp.tv_usec; 16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (vdec_msg.msgdata.output_frame.len) { 17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2]; 17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3]; 17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4]; 17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5]; 17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) { 18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.memory = V4L2_MEMORY_USERPTR; 18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.length = 1; 18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.m.planes = plane; 18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) { 18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE; 18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pfd.revents & POLLPRI) { 19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent); 19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) { 20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED; 20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved \n"); 20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 20661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT ) { 20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_INFO_CONFIG_CHANGED; 21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 21261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved \n"); 21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 21761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) { 21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE; 22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 22161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n VIDC Flush Done Recieved \n"); 22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE; 22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 22861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n VIDC Flush Done Recieved \n"); 22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 23061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 23161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 23261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 23361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) { 23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n VIDC Close Done Recieved and async_message_thread Exited \n"); 23561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) { 23761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR; 23961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n SYS Error Recieved \n"); 24161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 24361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n VIDC Some Event recieved \n"); 24761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan continue; 24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n"); 25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input) 256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec* omx = reinterpret_cast<omx_vdec*>(input); 25861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char id; 25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int n; 26061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx == NULL) { 26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("message thread null pointer rxd\n"); 26261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 26361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 26561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: message thread start\n"); 26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0); 26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan n = read(omx->m_pipe_in, &id, 1); 270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 27161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == n) { 27261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 27361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 27561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (1 == n) { 27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->process_event_cb(omx, id); 27761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((n < 0) && (errno != EINTR)) { 27961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\nERROR: read from pipe failed, ret %d errno %d", n, errno); 28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 28161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 28361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n"); 28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id) 288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 28961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret_value; 2906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 29161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx == NULL) { 29261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("message thread null pointer rxd\n"); 29361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 29461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 29561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out); 29661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret_value = write(omx->m_pipe_out, &id, 1); 29761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value); 298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor 301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue() 302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 30361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Nothing to do 304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor 307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memset(m_q,0,sizeof(m_q)); 310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert 313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id) 314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 31561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 31661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) { 31761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].id = id; 31861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].param1 = p1; 31961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].param2 = p2; 32061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_write++; 32161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_size ++; 32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) { 32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_write = 0; 32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__); 32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop 333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id) 334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_size > 0) { 33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *id = m_q[m_read].id; 33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *p1 = m_q[m_read].param1; 33961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *p2 = m_q[m_read].param2; 34061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the read pointer ahead 34161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ++m_read; 34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan --m_size; 34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) { 34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_read = 0; 34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue 353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type() 354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return m_q[m_read].id; 356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list() 360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 36161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //initialize timestamps array 36261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) ); 363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list() 365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 36661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //free m_ts_arr_list? 367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts) 370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 37261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool duplicate_ts = false; 37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //insert at the first available empty location 37661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 37761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_ts_arr_list[idx].valid) { 37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //found invalid or empty entry, save timestamp 37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].valid = true; 38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].timestamp = ts; 38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts, idx); 38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) { 38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int min_idx = -1; 39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_TICKS min_ts = 0; 39961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 40061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 40161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 40261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_ts_arr_list[idx].valid) { 40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //found valid entry, save index 40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (min_idx < 0) { 40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //first valid entry 40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_ts = m_ts_arr_list[idx].timestamp; 40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_idx = idx; 40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_ts_arr_list[idx].timestamp < min_ts) { 41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_ts = m_ts_arr_list[idx].timestamp; 41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_idx = idx; 41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (min_idx < 0) { 41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //no valid entries found 41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts = 0; 42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts = m_ts_arr_list[min_idx].timestamp; 42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[min_idx].valid = false; 42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts, min_idx); 42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list() 435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 43761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 43861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 44061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 44161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].valid = false; 44261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 44361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances 448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void) 449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return (new omx_vdec); 451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base, 45661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_handle *handle, int ionMapfd) 457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 45861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd); 459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base) 462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // dup file descriptor, map once, use pmem 464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev init(dup(fd), base, size, 0 , MEM_DEVICE); 465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_ 468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 46961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 47061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::omx_vdec 471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Constructor 474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 47561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None 477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 48061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::omx_vdec(): m_error_propogated(false), 48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state(OMX_StateInvalid), 48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_app_data(NULL), 48461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr(NULL), 48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr(NULL), 48661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_err_count(0), 48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress (false), 48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress (false), 48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_use_buffer (false), 49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_use_buffer (false), 49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers(false), 49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem(OMX_FALSE), 49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_region_smi(OMX_FALSE), 49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_pvt_entry_pmem(OMX_FALSE), 49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers(0), 49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers(0), 49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count(0), 49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bm_count(0), 49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated(OMX_FALSE), 50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bPopulated(OMX_FALSE), 50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_flags(0), 502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr(NULL), 504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled(OMX_TRUE), 50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled(OMX_TRUE), 50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_in_alloc_cnt(0), 50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list(NULL), 50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry(NULL), 51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info(NULL), 51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes (true), 51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame (NULL), 51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame (NULL), 51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr (NULL), 51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr(NULL), 51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_inp_bm_count (0), 51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse ((codec_type)0), 51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame_meta (true), 51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count (0), 52061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count (0), 52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length(0), 52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal (false), 52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame(0), 52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_buffer(NULL), 52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame_size (0), 52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_device_file_ptr(NULL), 52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile((vc1_profile_type)0), 52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts(LLONG_MAX), 52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags(0), 53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts(LLONG_MAX), 53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts(true), 53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int(0), 53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan in_reconfig(false), 53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_display_id(NULL), 53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser(NULL), 53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata(0), 537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_enable_android_native_buffers(OMX_FALSE), 53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_android_native_buffers(OMX_FALSE), 54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan iDivXDrmDecrypt(NULL), 541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr(NULL), 54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan secure_mode(false) 544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Assumption is that , to begin with , we have all the frames with decoder */ 54661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("In OMX vdec Constructor"); 547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char property_value[PROPERTY_VALUE_MAX] = {0}; 54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.perf", property_value, "0"); 55061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan perf_flag = atoi(property_value); 55161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag); 55361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 55461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms = latency = 0; 55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 55661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 55761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.ts", property_value, "0"); 55861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_timestamp = atoi(property_value); 55961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp); 56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 56161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(true); 56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.enable_debug_print(true); 56361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.concealedmb", property_value, "0"); 56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_concealedmb = atoi(property_value); 56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb); 569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_cmp,0,sizeof(m_cmp)); 57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_cb,0,sizeof(m_cb)); 57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (&drv_ctx,0,sizeof(drv_ctx)); 57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE)); 57561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (m_hwdevice_name,0,sizeof(m_hwdevice_name)); 57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, sizeof(m_demux_offsets) ); 57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 5786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_ 57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 5806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.timestamp_adjust = false; 58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = -1; 58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = NULL; 58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init(&m_lock, NULL); 58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init(&c_lock, NULL); 58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_init(&m_cmd_lock,0,0); 58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = 58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[OUTPUT_PORT] = false; 590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 59161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char extradata_value[PROPERTY_VALUE_MAX] = {0}; 59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.extradata", extradata_value, "0"); 59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_extradata = atoi(extradata_value); 59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata); 595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB; 59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_buffers.set_vdec_client(this); 5986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 5996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 6006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = { 60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_FLUSH_DONE, 60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT, 60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT, 60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_CLOSE_DONE, 60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_SYS_ERROR 6066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}; 6076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 6086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd) 6096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 61161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event_subscription sub; 61261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int array_sz = sizeof(event_type)/sizeof(int); 61361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i,rc; 61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan printf("Invalid input: %d\n", fd); 61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < array_sz; ++i) { 62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 62161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan printf("Failed to subscribe event: 0x%x\n", sub.type); 62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < array_sz) { 62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (--i; i >=0 ; i--) { 63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) 63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan printf("Failed to unsubscribe event: 0x%x\n", sub.type); 63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNotImplemented; 63761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd) 6436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 64561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event_subscription sub; 64661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int array_sz = sizeof(event_type)/sizeof(int); 64761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i,rc; 64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 64961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan printf("Invalid input: %d\n", fd); 65061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 65161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 65261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 65361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < array_sz; ++i) { 65461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 65561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan printf("Failed to unsubscribe event: 0x%x\n", sub.type); 65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 6636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 6646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::~omx_vdec 668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Destructor 671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None 674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 67661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 67761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec() 679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = NULL; 68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_decoder_cmd dec; 68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("In OMX vdec Destructor"); 68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_pipe_in) close(m_pipe_in); 68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_pipe_out) close(m_pipe_out); 68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_in = -1; 68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_out = -1; 68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_join(msg_thread_id,NULL); 68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.cmd = V4L2_DEC_CMD_STOP; 69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n STOP Command failed\n"); 69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_join(async_thread_id,NULL); 69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsubscribe_to_events(drv_ctx.video_driver_fd); 69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&m_lock); 69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&c_lock); 69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_destroy(&m_cmd_lock); 70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME"); 70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.end(); 70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Exit OMX vdec Destructor"); 705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type) 70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 71161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 71261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = 0; 71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 7186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 7196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::OMXCntrlProcessMsgCb 723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL Client callbacks are generated through this routine. The decoder 72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan provides the thread context for this routine. 727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 72961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ctxt -- Context information related to the self. 73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id -- Event identifier. This could be any of the following: 73161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1. Command completion event 73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2. Buffer done callback event 73361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3. Frame done callback event 734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id) 740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan signed int p1; // Parameter - 1 74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan signed int p2; // Parameter - 2 74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int ident; 74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int qsize=0; // qsize 74561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec *pThis = (omx_vdec *) ctxt; 74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis) { 74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n", 74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan __func__); 75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Protect the shared queue data structure 75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan do { 75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Read the message id's from the queue*/ 75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&pThis->m_lock); 75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_cmd_q.m_size; 75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize == 0 && pThis->m_state != OMX_StatePause) { 76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_ftb_q.m_size; 76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 76761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize == 0 && pThis->m_state != OMX_StatePause) { 77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_etb_q.m_size; 77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 77261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&pThis->m_lock); 77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*process message if we have one*/ 77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize > 0) { 77961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id = ident; 78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (id) { 78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT: 78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (p1) { 78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandStateSet: 78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = (OMX_STATETYPE) p2; 78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d", 78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state); 78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL); 79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 79261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_EventError: 79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_StateInvalid) { 79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid"); 79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = (OMX_STATETYPE) p2; 79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 79761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (p2 == OMX_ErrorHardware) { 79961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error(); 80061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventError, p2, (OMX_U32)NULL, NULL ); 80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandPortDisable: 80761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2); 80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 81361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) { 81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT)) 81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to release output buffers\n"); 81861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf); 81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->in_reconfig = false; 82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error(); 82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandPortEnable: 83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2); 83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__); 84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_ETB_ARBITRARY: 84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure"); 84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_ETB: 85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure"); 85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FTB: 86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure"); 86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_COMMAND: 86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U32)p2,(OMX_PTR)NULL); 87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EBD: 87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) { 87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure"); 87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) { 88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_inp_err_count++; 88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->time_stamp_dts.remove_time_stamp( 88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp, 88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_inp_err_count = 0; 88761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( pThis->empty_buffer_done(&pThis->m_cmp, 88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n empty_buffer_done failure"); 89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) { 89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR); 89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: 90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int64_t *timestamp = (int64_t *)p1; 90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p1) { 90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->time_stamp_dts.remove_time_stamp(*timestamp, 90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(timestamp); 90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FBD: 91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure"); 91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( pThis->fill_buffer_done(&pThis->m_cmp, 91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n fill_buffer_done failure"); 91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete"); 92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->input_flush_progress) { 92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver"); 92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->execute_input_flush(); 92761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 92861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we need generate event for Flush done*/ 93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_INPUT_FLUSH_PENDING)) { 93561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client"); 93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandFlush, 93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX,NULL ); 94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 94261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_IDLE_PENDING)) { 94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) { 94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Failed to call streamoff on OUTPUT Port \n"); 94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->streaming[OUTPUT_PORT] = false; 94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->output_flush_progress) { 95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Input flush done hence issue stop"); 95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete"); 96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->output_flush_progress) { 96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver"); 96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->execute_output_flush(); 96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we need generate event for Flush done*/ 97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) { 97661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Notify Output Flush done"); 97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandFlush, 98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Internal flush complete"); 98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) { 98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event(OMX_CommandPortDisable, 99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) { 99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Failed to call streamoff on CAPTURE Port \n"); 100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->streaming[CAPTURE_PORT] = false; 100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->input_flush_progress) { 100661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Output flush done hence issue stop"); 100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 101361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_START_DONE: 101961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE"); 102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure"); 102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success"); 102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Move to executing"); 102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 103061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateExecuting; 103261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateExecuting, NULL); 103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (BITMASK_PRESENT(&pThis->m_flags, 103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_PAUSE_PENDING)) { 103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (/*ioctl (pThis->drv_ctx.video_driver_fd, 103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) { 103961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed"); 104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 104561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Event Handler callback is NULL"); 104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_PAUSE_DONE: 105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 105661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->complete_pending_buffer_done_cbs(); 105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) { 105861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Send the callback now 106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StatePause; 106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StatePause, NULL); 106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 107161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_RESUME_DONE: 107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Moving the decoder to execute state"); 108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateExecuting; 108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 108761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateExecuting,NULL); 108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_STOP_DONE: 109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->complete_pending_buffer_done_cbs(); 110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) { 110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success"); 110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateIdle; 110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Move to Idle State"); 111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateIdle,NULL); 111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG"); 112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_IndexParamPortDefinition) { 112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->in_reconfig = true; 112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventPortSettingsChanged, p1, p2, NULL ); 113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) { 113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1; 113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged; 113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan format = OMX_InterlaceInterleaveFrameTopFieldFirst; 113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan format = OMX_InterlaceInterleaveFrameBottomFieldFirst; 114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else //unsupported interlace format; raise a error 114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan event = OMX_EventError; 114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan event, format, 0, NULL ); 114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EOS_DONE: 115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->prev_ts = LLONG_MAX; 116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->rst_prev_ts = true; 116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 116461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG: 116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG"); 117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL ); 117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 117661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 117861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&pThis->m_lock); 118361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_cmd_q.m_size; 118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_state != OMX_StatePause) 118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&pThis->m_lock); 118761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } while (qsize>0); 1188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::update_resolution(int width, int height) 11926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 11936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.frame_height = height; 11946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.frame_width = width; 11956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.scan_lines = height; 11966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.stride = width; 11976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nLeft = 0; 11986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nTop = 0; 11996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nWidth = drv_ctx.video_resolution.frame_width; 12006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nHeight = drv_ctx.video_resolution.frame_height; 12016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 1202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 120461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 120561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentInit 1206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 120761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 120861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Initialize the component. 1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 121061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 121161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ctxt -- Context information related to the self. 121261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id -- Event identifier. This could be any of the following: 121361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1. Command completion event 121461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2. Buffer done callback event 121561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3. Frame done callback event 1216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) 1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_fmtdesc fdesc; 122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 122761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 122861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 122961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int alignment = 0,buffer_size = 0; 123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fds[2]; 123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int r,ret=0; 123261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool codec_ambiguous = false; 123361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STRING device_name = (OMX_STRING)"/dev/video/q6_dec"; 123461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = open(device_name, O_RDWR); 123561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open device %s returned fd %d, errno %d", 123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan device_name, drv_ctx.video_driver_fd, errno); 123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 123961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_driver_fd == 0) { 124061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = open(device_name, O_RDWR); 124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_driver_fd < 0) { 124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno); 124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 1249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 12506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal ret = pthread_create(&async_thread_id,0,async_message_thread,this); 125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret < 0) { 125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Failed to create async_message_thread \n"); 125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcpy(inputfilename, INPUT_BUFFER_FILE_NAME); 1259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 126161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputBufferFile1 = fopen (outputfilename, "ab"); 1262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputExtradataFile = fopen (ouputextradatafilename, "ab"); 1265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Copy the role information which provides the decoder kind 126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy(drv_ctx.kind,role,128); 126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\ 127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 127261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mpeg4",\ 127361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 127461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.timestamp_adjust = true; 127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4; 127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingMPEG4; 127761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_MPEG4; 127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Start Code for MPEG4*/ 127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_MPEG4; 128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "m4v"); 1283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\ 128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mpeg2",\ 128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2; 128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_MPEG2; 129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingMPEG2; 129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Start Code for MPEG2*/ 129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_MPEG2; 129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "mpg"); 1296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\ 129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n H263 Decoder selected"); 130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_H263; 130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingH263; 130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_H263; 130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_H263; 130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "263"); 1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\ 131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected"); 131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3; 131461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX_311; 131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 131961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = createDivxDrmContext(); 132061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ 132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 132661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected"); 132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4; 132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX; 133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_ambiguous = true; 133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = createDivxDrmContext(); 133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\ 134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected"); 134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6; 134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX; 134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_ambiguous = true; 134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = createDivxDrmContext(); 135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("createDivxDrmContext Failed"); 135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 135761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\ 135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_H264; 136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_H264; 136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingAVC; 136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_H264; 136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "264"); 1368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\ 137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC; 137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_HEVC; 137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc; 137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_HEVC; 137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 13786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef INPUT_BUFFER_LOG 137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "265"); 13806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\ 138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_VC1; 138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingWMV; 138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VC1; 138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_VC1_ANNEX_G; 138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "vc1"); 1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\ 139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV; 139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingWMV; 139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VC1; 139861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_VC1_ANNEX_L; 139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "vc1"); 1402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 140361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",\ 140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_VP8; 140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingVPX; 140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VP8; 140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n"); 141261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan inputBufferFile1 = fopen (inputfilename, "ab"); 1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 1418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.output_format = VDEC_YUV_FORMAT_NV12; 14206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE) 14216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 14226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (!client_buffers.set_color_format(dest_color_format)) { 14236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_ERROR("\n Setting color format failed"); 14246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet = OMX_ErrorInsufficientResources; 14256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 1426dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan capture_capability= V4L2_PIX_FMT_NV12; 142861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = subscribe_to_events(drv_ctx.video_driver_fd); 142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Subscribe Event Failed \n"); 143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 143261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 143361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 143461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_capability cap; 143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap); 143661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 143761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to query capabilities\n"); 143861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 143961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s," 144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " version = %d, capabilities = %x\n", cap.driver, cap.card, 144261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan cap.bus_info, cap.version, cap.capabilities); 144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=0; 144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index=0; 144761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description, 144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.pixelformat, fdesc.flags); 145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index++; 145161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index=0; 145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 145561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description, 145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.pixelformat, fdesc.flags); 145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index++; 145961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal update_resolution(320, 240); 146161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to set format on output port\n"); 146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Set Format was successful \n "); 147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_ambiguous) { 147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (output_capability == V4L2_PIX_FMT_DIVX) { 147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control divx_ctrl; 147461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) { 147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4; 147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) { 147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5; 147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 148061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6; 148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 148261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT; 148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl); 148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to set divx version\n"); 148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Codec should not be ambiguous"); 149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 150061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to set format on capture port\n"); 150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Set Format was successful \n "); 150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE; 150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = 1; 150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d\n", ret); 150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d\n", ret); 151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Get the Buffer requirements for input and output ports*/ 151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT; 151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment=SZ_1M; 152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment=SZ_1M; 152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment=SZ_4K; 152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment=SZ_4K; 152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata = 0; 152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.picture_order = VDEC_ORDER_DISPLAY; 152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 152961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.idr_only_decoding = 0; 1532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 15336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_state = OMX_StateLoaded; 1534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA 15356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (eRet == OMX_ErrorNone && !secure_mode) 15366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal enable_extradata(DEFAULT_EXTRADATA, true, true); 1537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 15386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet=get_buffer_req(&drv_ctx.ip_buf); 15396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_HIGH("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size); 15406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal get_buffer_req(&drv_ctx.op_buf); 154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 || 154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC) { 154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size; 154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size); 154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 154661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nOffset = 0; 154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 154861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 154961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed "); 155061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 155261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 155461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils == NULL) { 155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils = new H264_Utils(); 155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils == NULL) { 155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n parser utils Allocation failed "); 156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size); 156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser = new h264_stream_parser(); 156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!h264_parser) { 156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!"); 157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 157161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 157261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pipe(fds)) { 157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("pipe creation failed\n"); 157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int temp1[2]; 157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fds[0] == 0 || fds[1] == 0) { 158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pipe (temp1)) { 158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("pipe creation failed\n"); 158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 15836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //close (fds[0]); 158561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //close (fds[1]); 158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fds[0] = temp1 [0]; 158761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fds[1] = temp1 [1]; 158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 158961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_in = fds[0]; 159061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_out = fds[1]; 159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan r = pthread_create(&msg_thread_id,0,message_thread,this); 159261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 159361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (r < 0) { 159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed"); 159561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 15996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Component Init Failed"); 160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG"); 160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL); 160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Calling close() on Video Driver"); 160661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.video_driver_fd); 160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = -1; 160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success"); 161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 161161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer)); 161261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 1613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 161661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 161761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetComponentVersion 1618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns the component version. 1621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 162361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan TBD. 1624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 162561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 162661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorNone. 1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 162861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_component_version 163061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan( 163161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 163261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STRING componentName, 163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* componentVersion, 163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* specVersion, 163561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_UUIDTYPE* componentUUID 163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 163861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n"); 1640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 164261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* TBD -- Return the proper version */ 164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (specVersion) { 164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan specVersion->nVersion = OMX_SPEC_VERSION; 164561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 1647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 164961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommand 1651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 165261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 165361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 1654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 165561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 1660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 166161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp, 166361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_COMMANDTYPE cmd, 166461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 param1, 166561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR cmdData 166661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client"); 166961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 1670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n"); 1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 1672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 167461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) { 167561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush " 167661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "to invalid port: %lu", param1); 167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 1678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 1680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_wait(&m_cmd_lock); 1681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n send_command: Command Processed\n"); 1682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 1683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommand 1688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 1691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 169261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 169561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_COMMANDTYPE cmd, 170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 param1, 170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR cmdData 170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 170561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STATETYPE eState = (OMX_STATETYPE) param1; 170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bFlag = 1,sem_posted = 0,ret=0; 170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd); 171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d", 171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state, eState); 171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (cmd == OMX_CommandStateSet) { 171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued"); 171561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState); 171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Loaded */ 171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateLoaded) { 172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateIdle) { 172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //if all buffers are allocated or all ports disabled 172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done() || 172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) { 172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n"); 172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n"); 172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 172861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 172961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 173061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Loaded */ 173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n"); 173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 173861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to WaitForResources */ 174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n"); 174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 174561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Executing */ 174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 174761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n"); 174861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 175261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Pause */ 175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 175461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n"); 175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 175961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Invalid */ 176061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 176161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n"); 176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\ 176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eState); 176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 177261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is IDLE */ 177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateIdle) { 177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateLoaded) { 177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_done()) { 177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* 177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Since error is None , we will post an event at the end 177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan of this function definition 178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n"); 178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 178361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n"); 178461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 178561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 178761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 178961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Executing */ 179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 179161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 179261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 179561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state=OMX_StateExecuting; 179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful\n"); 179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Idle */ 179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateIdle) { 180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n"); 180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 180361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 180561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to WaitForResources */ 180661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 180761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n"); 180861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 181061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Pause */ 181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 181461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*To pause the Video core we need to start the driver*/ 181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START, 181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL) < */0) { 181761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED"); 181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 181961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorHardware; 182061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 182161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 182261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n"); 182361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 182561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 182661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Invalid */ 182761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 182861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n"); 182961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 183061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 183161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState); 183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 183461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1835dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand } 1836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /******************************/ 183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Executing */ 183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /******************************/ 184061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateExecuting) { 184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting"); 184261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Idle */ 184361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateIdle) { 184461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 184561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition 184661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 184761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n"); 184861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 184961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 185061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_ALL); 185361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 185561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Paused */ 185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 185861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n PAUSE Command Issued"); 185961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StatePause; 186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 186161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 186261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Loaded */ 186361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 186461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n"); 186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 186961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to WaitForResources */ 187061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 187161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n"); 187261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 187561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 187661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Executing */ 187761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 187861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n"); 187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 188061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 188361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Invalid */ 188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 188561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n"); 188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState); 189061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 189161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 189261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 189361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 189461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Pause */ 189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StatePause) { 189761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Executing */ 189861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateExecuting) { 189961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Pause --> Executing \n"); 190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StateExecuting; 190161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 190361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Idle */ 190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateIdle) { 190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Pause --> Idle \n"); 190861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 190961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 191161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_ALL); 191361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 191461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 191561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 191661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to loaded */ 191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Pause --> loaded \n"); 191961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 192161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 192361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to WaitForResources */ 192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n"); 192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 193061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Pause */ 193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 193261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Pause --> Pause \n"); 193361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 193461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 193761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Invalid */ 193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 193961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Pause --> Invalid \n"); 194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState); 194461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 194661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is WaitForResources */ 194961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 195061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateWaitForResources) { 195161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Loaded */ 195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateLoaded) { 195361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 195561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n"); 195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 195761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to WaitForResources */ 195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n"); 196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState, 196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 196461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Executing */ 196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n"); 196761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 196861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 196961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 197161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Pause */ 197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 197361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n"); 197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 197861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Invalid */ 197961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 198061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n"); 198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 198261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Loaded - 198561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan is NOT tested by Khronos TS */ 198661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 198761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState); 198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 199261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /********************************/ 199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Invalid */ 199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*******************************/ 199561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateInvalid) { 199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* State Transition from Inavlid to any state */ 199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == (OMX_StateLoaded || OMX_StateWaitForResources 199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || OMX_StateIdle || OMX_StateExecuting 199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || OMX_StatePause || OMX_StateInvalid)) { 200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n"); 200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorInvalidState,\ 200261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 200361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 2004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 200561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (cmd == OMX_CommandFlush) { 200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued" 200761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Set the Semaphore"); 201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 201861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(param1); 201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 202061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( cmd == OMX_CommandPortEnable) { 202261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued" 202361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 202461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled = OMX_TRUE; 202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (m_state == OMX_StateLoaded && 202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || allocate_input_done()) { 203061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 203161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n"); 203461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 203661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 203761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 203861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 203961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Enable output Port command recieved"); 204161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled = OMX_TRUE; 204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (m_state == OMX_StateLoaded && 204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 204561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (allocate_output_done())) { 204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 2047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n"); 205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 205261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 205461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 205561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (cmd == OMX_CommandPortDisable) { 205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued" 205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 205961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 206061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled = OMX_FALSE; 206161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 206261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_input_done()) { 206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 2064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 207261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 207661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 207861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled = OMX_FALSE; 208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Disable output Port command recieved"); 208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_output_done()) { 208461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 2085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 208661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 209361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 209561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 209761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 209961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd); 210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNotImplemented; 210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone && bFlag) { 210661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 210961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post(&m_cmd_lock); 211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 211661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ExecuteOmxFlush 2118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Executes the OMX flush. 2121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan flushtype - input flush(1)/output flush(0)/ both. 2124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 212561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType) 2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 213261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 213361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer v4l2_buf; 213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_decoder_cmd dec; 213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("in %s", __func__); 213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH; 213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (flushType) { 213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CORE_INPUT_PORT_INDEX: 214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = true; 214161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT; 214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CORE_OUTPUT_PORT_INDEX: 214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = true; 214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = true; 214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = true; 215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | 215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Flush Port (%lu) Failed ", flushType); 215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = false; 215761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 2162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush 2163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 216561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at OUTPUT PORT. 2166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 216861a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone. 2169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false 2172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 2173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush() 2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 217561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1 = 0; // Parameter - 1 217661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2 = 0; // Parameter - 2 217761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident = 0; 217861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = true; 217961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 218061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Generate FBD for all Buffers in the FTBq*/ 218161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 218261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Initiate Output Flush"); 218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_ftb_q.m_size) { 218461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d", 218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.m_size,pending_output_buffers); 218661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.pop_entry(&p1,&p2,&ident); 218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2); 218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == m_fill_output_msg ) { 218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_FBD) { 219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 219461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = false; 219661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 219761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 219861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 219961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 220161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers); 220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 2205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush 2206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 220861a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at INPUT PORT. 2209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 221161a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone. 2212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false 2215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 2216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush() 2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 221861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i =0; 221961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1 = 0; // Parameter - 1 222061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2 = 0; // Parameter - 2 222161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident = 0; 222261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = true; 222361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 222461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Generate EBD for all Buffers in the ETBq*/ 222561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Initiate Input Flush \n"); 222661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 222761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 222861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Check if the Queue is empty \n"); 222961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_etb_q.m_size) { 223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_ETB) { 223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers++; 223761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 223961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 224061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p", 224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1); 224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 224561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.flush_timestamp(); 224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Heap Buffers are to be flushed*/ 224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 224961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Reset all the variables before flusing"); 225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 225161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count = 0; 225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count = 0; 225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 225561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = 0; 225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Initialize parser"); 225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) { 226061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 226161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 226361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_input_pending_q.m_size) { 226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&p1,&p2,&ident); 226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1); 226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame) { 226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame); 227061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 227161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 227261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 227361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL, 227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned int)NULL); 227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.flush(); 228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 228161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = false; 228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 228561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 228661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 228861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 228961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.reset_ts_list(); 229061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers); 229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommandEvent 2300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 230161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Send the event to decoder pipe. This is needed to generate the callbacks 230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan in decoder thread context. 2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 230661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 2307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 230961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 2310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 231161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1, 231361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int p2, 231461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int id) 2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 231961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 232161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (id == m_fill_output_msg || 232261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_FBD) { 232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.insert_entry(p1,p2,id); 232461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (id == OMX_COMPONENT_GENERATE_ETB || 232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_EBD || 232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 232761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.insert_entry(p1,p2,id); 232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 232961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cmd_q.insert_entry(p1,p2,id); 233061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this); 233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_message(this, id); 233561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 2342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNoMore; 234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!profileLevelType) 234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nPortIndex == 0) { 234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 235461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 235561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 235661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 2) { 235761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 235861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 235961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", 236161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->nProfileIndex); 236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // TODO 236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", 236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->nProfileIndex); 236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 237061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) { 237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_H263Level70; 237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex); 237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 238161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 238461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex); 238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 239161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 239361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 239461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple; 239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain; 239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 239961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex); 240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 240361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 240461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 240561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu\n", profileLevelType->nPortIndex); 240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 240861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetParameter 2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 241561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Get Parameter method implementation 2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 241961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 242261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Error None if successful. 2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 242461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 242661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE paramIndex, 242761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_PTR paramData) 2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: \n"); 243261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 2433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Get Param in Invalid State\n"); 2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (paramData == NULL) { 2437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Get Param in Invalid paramData \n"); 2438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 244061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)paramIndex) { 244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPortDefinition: 244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 244561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n"); 244661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = update_portdef(portDefn); 244761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 244861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_port_def = *portDefn; 244961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 245061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 245161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoInit: 245261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 245361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *portParamType = 245461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 245561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n"); 245661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nSize = sizeof(portParamType); 245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nPorts = 2; 246061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nStartPortNumber = 0; 246161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 246261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoPortFormat: 246461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 246561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 246661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n"); 246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 247061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nSize = sizeof(portFmt); 247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 247261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nPortIndex) { 247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nIndex) { 247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = OMX_COLOR_FormatUnused; 247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eCompressionFormat = eCompressionFormat; 247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " NoMore compression formats\n"); 247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (1 == portFmt->nPortIndex) { 248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nIndex) 248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE) 248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (1 == portFmt->nIndex) 248861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar; 248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " NoMore Color formats\n"); 249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 249361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("returning %d\n", portFmt->eColorFormat); 249561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n", 249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portFmt->nPortIndex); 249861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 249961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamAudioInit: 250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *audioPortParamType = 250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n"); 250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nSize = sizeof(audioPortParamType); 251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nPorts = 0; 251161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nStartPortNumber = 0; 251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 251361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamImageInit: 251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *imagePortParamType = 251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n"); 252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nSize = sizeof(imagePortParamType); 252261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nPorts = 0; 252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nStartPortNumber = 0; 252461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamOtherInit: 252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n", 253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedIndex; 253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 253461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamStandardComponentRole: 253661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_COMPONENTROLETYPE *comp_role; 253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->nSize = sizeof(*comp_role); 254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n", 254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 254561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 254861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Added for parameter test */ 254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPriorityMgmt: 255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PRIORITYMGMTTYPE *priorityMgmType = 255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PRIORITYMGMTTYPE *) paramData; 255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n"); 255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmType->nSize = sizeof(priorityMgmType); 2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 255961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Added for parameter test */ 256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamCompBufferSupplier: 256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n"); 256661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nSize = sizeof(bufferSupplierType); 256861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 256961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == bufferSupplierType->nPortIndex) 257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 257161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (1 == bufferSupplierType->nPortIndex) 257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 257461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 257561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoAvc: 258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 258161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n", 2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoH263: 258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 258761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n", 2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg4: 259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n", 259461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 259661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 259761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg2: 259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 259961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n", 2600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 260261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 260361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoProfileLevelQuerySupported: 260461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex); 260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType = 260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData; 260861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_supported_profile_level_for_1080p(profileLevelType); 260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 261161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: 261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 261461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n"); 261561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 261661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 261761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 261961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED | 262061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan GRALLOC_USAGE_PRIVATE_UNCACHED); 262161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 262261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_ 262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else 262561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x\n", (unsigned int)nativeBuffersUsage->nUsage); 262861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n"); 263161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 263661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex); 264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedIndex; 264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n", 264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width, 264761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_height, 264861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.stride, 264961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.scan_lines); 2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 265161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 2655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 2656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 2658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 266161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((params == NULL) || 266261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (params->nativeBuffer == NULL) || 266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (params->nativeBuffer->handle == NULL) || 266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !m_enable_android_native_buffers) 2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_android_native_buffers = OMX_TRUE; 2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sp<android_native_buffer_t> nBuf = params->nativeBuffer; 2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private_handle_t *handle = (private_handle_t *)nBuf->handle; 266961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buffer = NULL; 267161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 267261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = (OMX_U8*)mmap(0, handle->size, 2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 267461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == MAP_FAILED) { 267561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 267661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 2681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 268861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::Setparameter 2689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 269061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Set Parameter method implementation. 2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 269361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 269461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 269661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 269761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 269961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 270161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE paramIndex, 270261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR paramData) 2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 27056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal int ret=0; 27066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct v4l2_format fmt; 270761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Set Param in Invalid State\n"); 2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (paramData == NULL) { 271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n"); 271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 2714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 271561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state != OMX_StateLoaded) && 271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_out_bEnabled == OMX_TRUE) && 271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 271961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_inp_bEnabled == OMX_TRUE)) { 2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Set Param in Invalid State \n"); 2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 2722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 272361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)paramIndex) { 272461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPortDefinition: 2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 272761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has 272961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //been called. 273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n", 273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->format.video.nFrameHeight, 273261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->format.video.nFrameWidth); 273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_DirOutput == portDefn->eDir) { 273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n"); 273561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_display_id = portDefn->format.video.pNativeWindow; 273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffer_size; 273761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_buffer_req(buffer_size)) { 273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Error in getting buffer requirements"); 273961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount && 274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size ) { 274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual; 274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size = portDefn->nBufferSize; 274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(&drv_ctx.op_buf); 274661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 274761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_port_def = *portDefn; 274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 274961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)\n", 275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size, 275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual, portDefn->nBufferSize); 275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (OMX_DirInput == portDefn->eDir) { 275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((portDefn->format.video.xFramerate >> 16) > 0 && 275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) { 275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Frame rate only should be set if this is a "known value" or to 275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // activate ts prediction logic (arbitrary mode only) sending input 276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // timestamps with max value (LLONG_MAX). 276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu", 276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.xFramerate >> 16); 276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator); 276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.frame_rate.fps_numerator) { 276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 30; 276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator) 277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = (int) 277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator; 277561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", 277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int, drv_ctx.frame_rate.fps_numerator / 277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)drv_ctx.frame_rate.fps_denominator); 277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n"); 278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_resolution.frame_height != 278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight || 278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width != 278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth) { 278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n", 278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth, 278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight); 278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portDefn->format.video.nFrameHeight != 0x0 && 278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth != 0x0) { 278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan update_resolution(portDefn->format.video.nFrameWidth, 279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight); 279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d \n",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width); 279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Set Resolution failed"); 279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) { 280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf; 280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) & 280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (~(buffer_prop->alignment - 1)); 280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(buffer_prop); 281061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)\n", 281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size, 281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual, portDefn->nBufferSize); 281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 281561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portDefn->eDir == OMX_DirMax) { 281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->nPortIndex); 281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoPortFormat: 2824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret=0; 282861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n", 283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat); 283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (1 == portFmt->nPortIndex) { 283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum vdec_output_fromat op_format; 283861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) || 284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar)) 284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12; 284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (portFmt->eColorFormat == 284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_COLOR_FORMATTYPE) 284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka) 284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_format = VDEC_YUV_FORMAT_TILE_4x2; 284661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.output_format = op_format; 285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Set output format failed"); 285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.set_color_format(portFmt->eColorFormat)) { 286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Set color format failed"); 286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 286861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexPortDefn: 2871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt = 287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData; 287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n", 287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nFramePackingFormat); 287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Input port */ 287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portFmt->nPortIndex == 0) { 287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) { 288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 288261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session"); 288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = true; 288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portFmt->nFramePackingFormat == 288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_FramePacking_OnlyOneCompleteFrame) { 288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu\n", 289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nFramePackingFormat); 289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n"); 289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid && 289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nMemRegion < OMX_QCOM_MemRegionMax) && 289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) { 290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_region_smi = OMX_TRUE; 290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n"); 290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem = OMX_TRUE; 290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 290561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 290661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 290861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamStandardComponentRole: 29116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal { 291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_COMPONENTROLETYPE *comp_role; 291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n", 291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->cRole); 291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded)&& 291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 291961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Set Parameter called in valid state"); 292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n"); 292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 293061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 294461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 294661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 294761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 295161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 295361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 295861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 296061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) 296261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 296361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) { 296461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 296561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 296761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) { 297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) || 298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) { 298161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind); 298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 299061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 29916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 299261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPriorityMgmt: 2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state != OMX_StateLoaded) { 299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n"); 299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 299961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n", 300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmtype->nGroupID); 3002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n", 300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmtype->nGroupPriority); 3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 300661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 300761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 3008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 300961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamCompBufferSupplier: 30136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal { 301461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 301561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n", 301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->eBufferSupplier); 301761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 302061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 302261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 302361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 30266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoAvc: 302861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 302961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n", 303061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoH263: 303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n", 303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg4: 304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 304161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n", 304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg2: 304661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n", 304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 305061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoDecoderPictureOrder: 305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder = 305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData; 305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pic_order,rc=0; 305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n", 305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pictureOrder->eOutputPictureOrder); 305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) { 306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) { 306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = pic_order; 306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Set picture order failed"); 307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamConcealMBMapExtraData: 307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false, 308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 308661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamFrameInfoExtraData: 308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false, 309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamInterlaceExtraData: 309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false, 310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamH264TimeInfo: 310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false, 310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoDivx: 311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData; 311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexPlatformPvt: 312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n"); 312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData; 312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type); 312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 312861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_pvt_entry_pmem = OMX_TRUE; 312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n"); 313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem = OMX_TRUE; 313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 313361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 313461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 313761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoSyncFrameDecodingMode: 313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 313961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode"); 314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 314261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.idr_only_decoding = 1; 314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 314761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Set picture order failed"); 314961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 315061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 315161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE; 315261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE; 315361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 315461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 315561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Sync frame setting failed"); 315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 315761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 316061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 316261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamIndexExtraDataType: 316361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 316461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 316561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData; 316661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) && 316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (extradataIndexType->bEnabled == OMX_TRUE) && 316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (extradataIndexType->nPortIndex == 1)) { 316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n"); 317061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled); 317161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 317261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 317461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 317661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamEnableSmoothStreaming: 3177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 317861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 317961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 318061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER; 318161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = 1; 318261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 318361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc < 0) { 318461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver."); 318561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorHardware; 318661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 318861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 319061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Need to allow following two set_parameters even in Idle 319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * state. This is ANDROID architecture which is not in sync 319261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * with openmax standard. */ 319361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: 319461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enableNativeBuffers) { 319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_enable_android_native_buffers = enableNativeBuffers->enable; 319861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 320061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 320161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: 320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = use_android_native_buffer(hComp, paramData); 320461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamEnableTimeStampReorder: 320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData; 321061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) { 321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (reorder->bEnable == OMX_TRUE) { 321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int =0; 321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(true); 321461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 321861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (reorder->bEnable == OMX_TRUE) { 321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 322061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 322161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 322261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 322361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 322561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 322661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex); 322761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedIndex; 322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 323061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 323561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetConfig 3236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Get Config Method implementation. 3239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 324061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 324161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 324361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 324461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 3245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 324661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp, 324861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE configIndex, 324961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_PTR configData) 3250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 325161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 3252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 325361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 325461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Get Config in Invalid State\n"); 325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 325661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 325761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)configIndex) { 325961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexConfigInterlaced: 326061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_CONFIG_INTERLACETYPE *configFmt = 326261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_CONFIG_INTERLACETYPE *) configData; 326361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configFmt->nPortIndex == 1) { 326461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configFmt->nIndex == 0) { 326561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive; 326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configFmt->nIndex == 1) { 326761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = 326861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 326961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configFmt->nIndex == 2) { 327061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = 327161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 327261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 327361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:" 327461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " NoMore Interlaced formats\n"); 327561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 327661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 327761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 327861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 327961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n", 328061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)configFmt->nPortIndex); 328161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 328261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 328361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 328461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 328561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexQueryNumberOfVideoDecInstance: 328661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 328761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances = 328861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData; 328961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoderinstances->nNumOfInstances = 16; 329061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 329161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 329261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 329361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexConfigVideoFramePackingArrangement: 329461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 329561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 329661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt = 329761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData; 329861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->get_frame_pack_data(configFmt); 329961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 330061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs"); 330161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 330261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 330361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 330461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexConfigCommonOutputCrop: 330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 330661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 330761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE)); 330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 331161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 331261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex); 331361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 331461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 331561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 331761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 331861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 332261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 332361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SetConfig 3324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 332561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 332661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Set Config method implementation 3327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 332861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 332961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 333161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 333261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 333361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp, 333561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE configIndex, 333661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR configData) 3337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 333861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 333961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Get Config in Invalid State\n"); 334061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 334161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 334261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 334361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 334461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_CONFIG_NALSIZE *pNal; 334561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Set Config Called"); 334761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateExecuting) { 334961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n"); 335061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 335161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 335261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) { 335461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData; 335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called"); 335661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) { 335761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC"); 335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 extra_size; 335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Parsing done here for the AVC atom is definitely not generic 336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Currently this piece of code is working, but certainly 336161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // not tested with all .mp4 files. 336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Incase of failure, we might need to revisit this 336361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // for a generic piece of code. 336461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 336561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Retrieve size of NAL length field 336661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // byte #4 contains the size of NAL lenght field 336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length = (config->pData[4] & 0x03) + 1; 336861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_size = 0; 337061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length > 2) { 337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Presently we assume that only one SPS and one PPS in AvC1 Atom */ 337261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_size = (nal_length - 2) * 2; 337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 337461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 337561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // SPS starts from byte #6 337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]); 337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pDestBuf; 3378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 337961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // minus 6 --> SPS starts from byte #6 338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // minus 1 --> picture param set byte to be ignored from avcatom 338261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size; 338361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize); 338461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 len; 338561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 index = 0; 338661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // case where SPS+PPS is sent as part of set_config 338761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf = m_vendor_config.pData; 338861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 338961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n", 339061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex, 339161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize, 339261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData); 339361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (index < 2) { 339461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint8 *psize; 339561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = *pSrcBuf; 339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = len << 8; 339761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len |= *(pSrcBuf + 1); 339861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psize = (uint8 *) & len; 339961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(pDestBuf + nal_length, pSrcBuf + 2,len); 340061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (unsigned int i = 0; i < nal_length; i++) { 340161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf[i] = psize[nal_length - 1 - i]; 340261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 340361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //memcpy(pDestBuf,pSrcBuf,(len+2)); 340461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf += len + nal_length; 340561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pSrcBuf += len + 2; 340661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index++; 340761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pSrcBuf++; // skip picture param set 340861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = 0; 340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") || 341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) { 3412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 3413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize = config->nDataSize; 341461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize)); 341561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData,config->nDataSize); 341661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) { 341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_vendor_config.pData) { 341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_vendor_config.pData); 341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = NULL; 342061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = 0; 342161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 342261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 342361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (((*((OMX_U32 *) config->pData)) & 342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE_MASK) == 342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE) { 342661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n"); 342761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 342861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 342961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = 343061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *) malloc(config->nDataSize); 343161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData, 343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan config->nDataSize); 343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_SP_MP_RCV; 343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) { 343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n"); 343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 343861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = 343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *) malloc((config->nDataSize)); 344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData, 344161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan config->nDataSize); 344261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_AP; 344361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) { 344461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n"); 344561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 344661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 344761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize); 344861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData,config->pData,config->nDataSize); 344961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_SP_MP_RCV; 345061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 345161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n"); 345261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 345461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 345561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configIndex == OMX_IndexConfigVideoNalSize) { 345661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 345761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData); 345861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length = pNal->nNaluBytes; 345961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 346061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length); 346161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 3462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 346461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 3465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 346861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 346961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetExtensionIndex 3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 347161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX GetExtensionIndex method implementaion. <TBD> 3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 347461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 347561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 347761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 347861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 348061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 348261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_STRING paramName, 348361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_INDEXTYPE* indexType) 3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 348561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n"); 3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 348861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) { 3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode; 349061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) { 3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType; 3492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 349461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) { 3495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 349661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) { 3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 349861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) { 3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName); 3500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 350161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) { 3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 350561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName); 3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNotImplemented; 3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 351361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 351461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetState 3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 351661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 351761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns the state information back to the caller.<TBD> 3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 351961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 352061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 352261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 352361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Error None if everything is successful. 352461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp, 352661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STATETYPE* state) 3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 352861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *state = m_state; 352961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state); 353061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 3531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 353461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 353561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentTunnelRequest 3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 353761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 353861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Component Tunnel Request method implementation. <TBD> 3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 354061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 354161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 354361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 354461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 3545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 354661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 354861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 354961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE peerComponent, 355061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 peerPort, 355161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 3552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 355361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n"); 355461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 3555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 355861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 355961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseOutputBuffer 3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 356161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 356261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper function for Use buffer in the input pin 3563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 356461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 356561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 3566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 356761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 356861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 3569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 357061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 35716eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_extradata() 35726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 35736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 357461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.buffer_size) { 357561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) { 357661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 357761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 357861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 357961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 358061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095); 358161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("allocate extradata memory size %d\n", drv_ctx.extradata_info.size); 358261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory( 358361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size, 4096, 358461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.extradata_info.ion.ion_alloc_data, 358561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.extradata_info.ion.fd_ion_data, 0); 358661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.ion.ion_device_fd < 0) { 358761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n"); 358861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 358961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 359061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.uaddr = (char *)mmap(NULL, 359161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size, 359261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, 359361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.ion.fd_ion_data.fd , 0); 359461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.uaddr == MAP_FAILED) { 359561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to map extradata memory\n"); 359661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 359761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 359861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 359961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 360061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size); 360161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 360361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 36046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 36056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 360661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_extradata() 360761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 36086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 360961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.uaddr) { 361061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 361161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 361261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 361361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 361461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 36156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 36166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 36176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 3618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_output_buffer( 361961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 362061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 362161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 362261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 362361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 362461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 362661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 362761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 362861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; // Temporary counter 362961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 363061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PTR privateAppData = NULL; 363161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan private_handle_t *handle = NULL; 363261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *buff = buffer; 363361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 363461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 363561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 36366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 363761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 363861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers"); 363961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_output_headers(); 364061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 364161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_extradata(); 364261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 364361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 364461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 364561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 364661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,i)) { 364761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 364861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 365061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 365161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 365261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i >= drv_ctx.op_buf.actualcount) { 365361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Already using %d o/p buffers\n", drv_ctx.op_buf.actualcount); 365461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 365561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 365761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 365861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 365961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 366061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_use_android_native_buffers) { 366161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 366261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sp<android_native_buffer_t> nBuf = params->nativeBuffer; 366361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle = (private_handle_t *)nBuf->handle; 366461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = params->pAppPrivate; 366561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 366661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle = (private_handle_t *)buff; 366761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 366861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 366961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 367061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 367161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 367261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " expected %u, got %lu", 367361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size); 367461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 367561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 367661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 367761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size; 367861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_use_android_native_buffers) { 367961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 368061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buff = (OMX_U8*)mmap(0, handle->size, 368161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 368261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buff == MAP_FAILED) { 368361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 368461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 368561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 36876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 36886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#if defined(_ANDROID_ICS_) 368961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan native_buffer[i].nativehandle = handle; 369061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan native_buffer[i].privatehandle = handle; 36916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 369261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!handle) { 369361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 369461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 369561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 369661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 369761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = 0; 369861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 369961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = 370061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 370161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 3702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 370461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ouput_egl_buffers && !m_use_output_pmem) { 3705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 370661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("allocate output buffer memory size %d\n", drv_ctx.op_buf.buffer_size); 370761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 370861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 370961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 371061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0); 371161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 371261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ION device fd is bad %d\n", drv_ctx.op_buf_ion_info[i].ion_device_fd); 371361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 371461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 371561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 371661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 3717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 371861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 371961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan open (MEM_DEVICE,O_RDWR); 3720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 372161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 372261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd); 372361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 372461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 372661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */ 372761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) { 372861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 372961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan open (MEM_DEVICE,O_RDWR); 373061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 373161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd); 373261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 373361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 373461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 373661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 373761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size, 373861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment)) { 373961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed"); 374061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 374161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 374261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 374461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 374561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 374661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 374761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, 374861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 374961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 375061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 3751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 375261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 3753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 375461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Unable to mmap output buffer\n"); 375561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 375661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 375761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 375861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = 0; 375961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 376061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 376161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 376261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem); 376361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!appData || !bytes ) { 376461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && !buffer) { 376561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case"); 376661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 376761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 376861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 376961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 377061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 377161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 377261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 377361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pmem_list->entryList || !pmem_list->entryList->entry || 377461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !pmem_list->nEntries || 377561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 377661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer"); 377761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 377861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 377961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 378061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list->entryList->entry; 378161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x", 378261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info->pmem_fd); 378361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 378461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 378561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 378661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = 378761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 378861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 3789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 379061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 379161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd; 379261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 379361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_out_mem_ptr + i ); 379461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 379561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 379661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 379761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 379861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 379961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 380061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i, 380161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr, 380261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd ); 380361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 380461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 380561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 380661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 380761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 380861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 380961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 381061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd; 381161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 381261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 381361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 381461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 381561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 381661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 381761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION 381861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 381961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 382061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 382161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 382261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 382361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx); 382461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 3825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 382661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 382761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 382861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 382961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]); 3830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 383161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) { 383261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to prepare bufs\n"); 383361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 383461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 3835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 383761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) { 383861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 383961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 384061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) { 384161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 384261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 384361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = true; 384461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n STREAMON Successful \n "); 384561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 384761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 384861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 384961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 385061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle); 385161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = (OMX_U8 *)handle; 385261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 385361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = buff; 385461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 385561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pAppPrivate = privateAppData; 385661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_out_bm_count,i); 385761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 385861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 386261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 386361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::use_input_heap_buffers 3864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 386561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 386661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use Buffer Heap allocation method implementation. 3867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 386861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 386961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 387161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 387261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None , if everything successful. 3873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 387461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_input_heap_buffers( 387661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 387761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 387861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 387961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 388061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 388161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 388361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer); 388461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 388561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_heap_ptr) 388661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 388761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 388861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 388961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_phdr_pmem_ptr) 389061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 389161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 389261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 389361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) { 389461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficent memory"); 389561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 389661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) { 389761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_use_buffer = true; 389861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 389961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 390061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 390161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 390261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 390361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 390461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 390561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 390661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 390761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], 390861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 390961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:Free_q is full"); 391061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 391161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 391261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_in_alloc_cnt++; 391361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 391461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("All i/p buffers have been set!"); 391561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 391661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 391761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 392161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 392261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseBuffer 3923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 392461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 392561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use Buffer method implementation. 3926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 392761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 392861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 393061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 393161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None , if everything successful. 3932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 393361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_buffer( 393561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 393661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 393761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 393861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 393961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 394061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 394261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE error = OMX_ErrorNone; 394361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 394461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 394561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || bytes == 0) { 394661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && buffer == NULL) { 394761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer); 394861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 394961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 395061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 395161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 395261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n"); 395361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 395461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 395561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) 395661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 395761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (port == OMX_CORE_OUTPUT_PORT_INDEX) 395861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested 395961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 396061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port); 396161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = OMX_ErrorBadPortIndex; 396261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 396361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error); 396461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error == OMX_ErrorNone) { 396561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 396661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 396761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 396861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandStateSet,OMX_StateIdle, 396961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 397061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 397161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 397261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 397361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 397461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 397561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX, 397661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 397761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 397861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 397961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 398061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 398161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 398261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 398361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 398461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 398561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return error; 398661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 3987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex, 398961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *pmem_bufferHdr) 3990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 399161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) { 399261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr[bufferindex].pBuffer) 399361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_inp_heap_ptr[bufferindex].pBuffer); 399461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[bufferindex].pBuffer = NULL; 399561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 399661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_bufferHdr) 399761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(pmem_bufferHdr); 399861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 3999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 400361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 400461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || m_inp_mem_ptr == NULL) { 400561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 400661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 400861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufferHdr - m_inp_mem_ptr; 4009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index); 401061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 401161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) { 401261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index); 401361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) { 401461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 401561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT; 401661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 401761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 401861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d", 4019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].pmem_fd); 402061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n unmap the input buffer size=%d address = %d", 4021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].mmaped_size, 4022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].bufferaddr); 402361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 402461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].mmaped_size); 402561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.ptr_inputbuffer[index].pmem_fd); 402661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 402761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) { 402861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_desc_buffer_ptr[index].buf_addr); 402961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].buf_addr = NULL; 403061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].desc_data_size = 0; 403161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 403361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 4034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 403561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 403861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 4039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 404361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 4044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 404561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || m_out_mem_ptr == NULL) { 404661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 404761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 404961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufferHdr - m_out_mem_ptr; 405061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index); 4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 405261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < drv_ctx.op_buf.actualcount 405361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_outputbuffer) { 405461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index, 405561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].bufferaddr); 4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 405761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 405861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 405961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 406061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 4061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 406261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 406361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 406461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 406561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].mmaped_size); 406661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 406761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 406861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 4069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 407061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) { 407161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d", 407261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].pmem_fd); 407361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d address = %d", 407461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount, 407561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].bufferaddr); 407661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr, 407761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount); 407861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.ptr_outputbuffer[0].pmem_fd); 407961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].pmem_fd = -1; 4080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 408161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[0]); 4082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 408361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 408561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 408761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 408861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_extradata(); 408961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 40906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 4091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 409261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 4093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 409761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE **bufferHdr, 409861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 port, 409961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PTR appData, 410061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 bytes) 4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 410261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *input = NULL; 410361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *buf_addr = NULL; 410461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 410561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i = 0; 410661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 410761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Sanity Check*/ 410861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL) { 410961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 411061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 411161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 411261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr == NULL) { 411361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 411461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 411561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 411661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 411761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 411861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 411961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 412061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr == NULL) { 412161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed "); 412261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 412361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 412461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 412561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 412661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Find a Free index*/ 412761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 412861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) { 412961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i); 413061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 413161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 413261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 413361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 413461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.ip_buf.actualcount) { 413561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 413661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 413761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_addr == NULL) { 413861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 413961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 414061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 414161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_inp_heap_ptr + i); 414261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input = *bufferHdr; 414361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_heap_inp_bm_count,i); 414461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 414561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)buf_addr; 414661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 414761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nVersion.nVersion = OMX_SPEC_VERSION; 414861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nAllocLen = drv_ctx.ip_buf.buffer_size; 414961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pAppPrivate = appData; 415061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 415161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr ); 415261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 415361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]); 415461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Add the Buffers to freeq*/ 415561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i], 415661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 415761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:Free_q is full"); 415861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 415961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 416061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 416161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 416261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 416361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 416461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 417061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 417161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateInputBuffer 4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 417361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 417461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper function for allocate buffer in the input pin 4175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 417661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 417761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 417961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 418061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 418261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_buffer( 418461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 418561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 418661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 418761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 418861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 419261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 419361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *input = NULL; 419461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i = 0; 419561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *buf_addr = NULL; 419661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pmem_fd = -1; 4197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bytes != drv_ctx.ip_buf.buffer_size) { 419961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d", 420061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes, drv_ctx.ip_buf.buffer_size); 420161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 420261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 420461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_mem_ptr) { 420561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)", 420661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount, 420761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size); 4208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 420961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 421061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 4211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 421261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr == NULL) { 421361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 421461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 421661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \ 421761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount); 4218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 421961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer == NULL) { 422061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 422161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 422361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \ 422461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount); 4225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 422661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ip_buf_ion_info == NULL) { 422761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 422861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 423161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.ip_buf.actualcount; i++) { 423261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 423461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 423661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 423961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 424061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 424161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i); 424261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 424361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 424661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.ip_buf.actualcount) { 424761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 424861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 424961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 42506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 4251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 425261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Allocate input Buffer size %d\n", drv_ctx.ip_buf.buffer_size); 425361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 425461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 425561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 425661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0); 425761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 425861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 425961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 426061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 4261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 426261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 426461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 426561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer"); 426661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 426761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 426961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd == 0) { 427061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 427261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 427361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer"); 427461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 427561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 427661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 427861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size, 427961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment)) { 428061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed"); 428161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 428261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 428361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 428561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 428661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_addr = (unsigned char *)mmap(NULL, 428761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size, 428861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 4289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 429061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_addr == MAP_FAILED) { 429161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 4292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 429361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 4294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 429561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer"); 429661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 429761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 429861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 429961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_inp_mem_ptr + i); 430061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 430161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr; 430261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 430361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 430461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 430561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 430661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 430761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].offset = 0; 430861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 430961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 431061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 431161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 431261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 431361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.bytesused = 0; 431461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size; 431561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr; 431661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd; 431761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[1] = 0; 431861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset; 431961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = &plane; 432061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = 1; 432161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 432261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Set the input Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]); 432361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 432461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 432561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 432661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 432761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to prepare bufs\n"); 432861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 432961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 4330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 433261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input = *bufferHdr; 433361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_inp_bm_count,i); 433461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr); 433561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 433661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd; 433761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 433861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)buf_addr; 433961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 434061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nVersion.nVersion = OMX_SPEC_VERSION; 434161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nAllocLen = drv_ctx.ip_buf.buffer_size; 434261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pAppPrivate = appData; 434361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 434461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; 434561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 434661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.disable_dmx) { 434761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_desc_buffer(i); 434861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 434961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 435061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found"); 435161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 435261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 435361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 435861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 435961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateOutputBuffer 4360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 436161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 436261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper fn for AllocateBuffer in the output pin 4363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 436461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 436561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 4366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 436761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 436861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went well. 4369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 437061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_buffer( 437261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 437361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 437461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 437561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 437661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 437861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 437961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 438061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; // Temporary counter 438161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 438261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 4383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 438461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ion_device_fd =-1; 438561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_allocation_data ion_alloc_data; 438661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_fd_data fd_ion_data; 4387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 438861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 438961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)", 439061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount, 439161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 439261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nBufHdrSize = 0; 439361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformEntrySize = 0; 439461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformListSize = 0; 439561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPMEMInfoSize = 0; 439661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pmem_fd = -1; 439761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *pmem_baseaddress = NULL; 439861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 439961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 440061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 440161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 440261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 440361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n", 440461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 440561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufHdrSize = drv_ctx.op_buf.actualcount * 440661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE); 440761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 440861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize = drv_ctx.op_buf.actualcount * 440961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 441061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize = drv_ctx.op_buf.actualcount * 441161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 441261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformEntrySize = drv_ctx.op_buf.actualcount * 441361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 441461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 441561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize, 441661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE), 441761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize, 441861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize); 441961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize, 442061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 442261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("allocate outputBuffer size %d \n",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount); 442361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_device_fd = alloc_map_ion_memory( 442461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount, 442561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment, 442661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0); 442761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ion_device_fd < 0) { 442861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 442961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 443061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = fd_ion_data.fd; 4431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 443261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 443461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 443561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d", 443661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 443761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 443861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 444061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd == 0) { 444161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 444361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 444461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d", 444561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 444661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 444761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 444861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 445061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size * 445161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount, 445261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment)) { 445361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed"); 445461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 445561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 445661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 445861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 445961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress = (unsigned char *)mmap(NULL, 446061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.op_buf.buffer_size * 446161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount), 446261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 446361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_baseaddress == MAP_FAILED) { 446461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n MMAP failed for Size %d", 446561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 446661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 4467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 446861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 4469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 447061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 447161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 447261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 447361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 447461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Alloc mem for platform specific info 447561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *pPtr=NULL; 447661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 447761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize,1); 447861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\ 447961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_bufferpayload), 448061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 448161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 448261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo), 448361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = (struct vdec_ion *)\ 448661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_ion), 448761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 449061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 449161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_respbuffer) { 449261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size = 449361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.op_buf.buffer_size * 449461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 449561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr = m_out_mem_ptr; 449661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 449761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 449861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_list) + nPlatformListSize); 449961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 450061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_entry) + nPlatformEntrySize); 450161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList = m_platform_list; 450261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry = m_platform_entry; 450361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = m_pmem_info; 450461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 450561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr); 450661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 450761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Settting the entire storage nicely 450861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry); 450961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo); 451061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 451161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 451261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 451361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Set the values when we determine the right HxW param 451461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nAllocLen = bytes; 451561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nFilledLen = 0; 451661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pAppPrivate = appData; 451761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 451861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Platform specific PMEM Information 451961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform Entry 452061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i); 452161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 452261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->entry = pPMEMInfo; 452361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform List 452461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->nEntries = 1; 452561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->entryList = pPlatformEntry; 452661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep pBuffer NULL till vdec is opened 452761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pBuffer = NULL; 452861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOffset = 0; 452961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 453061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i; 453161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->pmem_fd = 0; 453261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pPlatformPrivate = pPlatformList; 453361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 453461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd; 453561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].pmem_fd = pmem_fd; 4536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 453761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd; 453861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data; 453961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data; 4540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 454261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create a mapping between buffers*/ 454361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 454461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 454561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ptr_outputbuffer[i]; 454661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i; 454761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 454861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i); 454961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 455061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p", 455161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd, drv_ctx.ptr_outputbuffer[i].offset, 455261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr); 455361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the buffer and buffer header pointers 455461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr++; 455561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo++; 455661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry++; 455761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList++; 455861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 455961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 456061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\ 456161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr, pPtr); 456261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 456361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_out_mem_ptr); 456461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 456561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 456661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pPtr) { 456761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(pPtr); 456861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = NULL; 456961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 457061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 457161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_outputbuffer); 457261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 457361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 457461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 457561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_respbuffer); 457661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 457761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 457961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info) { 458061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free o/p ion context"); 458161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 458261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = NULL; 458361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 458561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 458661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 458761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 458861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_extradata(); 458961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 459061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 459161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 459261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,i)) { 459361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i); 459461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 459561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 459861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 459961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.op_buf.actualcount) { 460061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 460161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 460261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 460361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 460461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 460561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = 460661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size; 460761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 460861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_out_mem_ptr + i ); 460961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 461061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 461161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 461261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size; 461361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 461461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 461561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 461661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 461761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 461861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 461961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 46206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 462161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 46226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 462361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 462461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 462561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 462661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 462761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 462861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 4629b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION 463061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 4631b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif 463261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 463361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 463461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 463561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d\n", extra_idx); 463661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 463761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 463861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 463961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 464061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]); 464161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 464261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 464361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 464461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 464561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 464661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 464761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 464861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 464961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 465061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 465161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 465261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 465361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 465461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = true; 465561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n STREAMON Successful \n "); 465661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 465761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 465861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 465961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 466061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pAppPrivate = appData; 466161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_out_bm_count,i); 466261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 466361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n"); 466461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 466561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 466861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer -- API Call 4673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 467461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 467561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateBuffer 4676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 467761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 467861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 4679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 468061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 468161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 468361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 468461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 468661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 468861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 468961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 469061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 469161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i = 0; 4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 4695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port); 469761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 4698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n"); 4699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 4700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 470261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 470361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 470461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes); 470561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 470661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); 470761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 470861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 47096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port, 47106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal appData,bytes); 471161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 471261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port); 471361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 471661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 471761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done()) { 471861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 4719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 4721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet,OMX_StateIdle, 472261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 472561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) { 472661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 472761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 472861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 4729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX, 4730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 473161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 473361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) { 473461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 473561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 473761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 473861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet); 4743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call 4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 474861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 474961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::FreeBuffer 4750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 475161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 4752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 475361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 475461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 475661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 475761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 475961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 476161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 476261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 4763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 4765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int nPortIndex; 4766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("In for decoder free_buffer \n"); 4767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 476861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateIdle && 476961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 4770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n"); 477161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 477261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) { 4773dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port); 477461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((port == OMX_CORE_INPUT_PORT_INDEX && 477561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) || 477661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (port == OMX_CORE_OUTPUT_PORT_INDEX && 477761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) { 477861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Free Buffer while port %d enable pending\n", port); 477961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) { 4780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n"); 4781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 478261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorPortUnpopulated, 478361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 478661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_state != OMX_StateInvalid) { 4787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n"); 4788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 478961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorPortUnpopulated, 479061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 479361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 479461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if arbitrary bytes*/ 479561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes && !input_use_buffer) 479661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer - m_inp_mem_ptr; 479761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 479861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer - m_inp_heap_ptr; 4799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex); 480161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex < drv_ctx.ip_buf.actualcount) { 480261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Clear the bit associated with it. 480361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 480461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 480561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 480661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 480761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex); 480861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) 480961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 481061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 481161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 481261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) 481361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]); 481461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 481561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(nPortIndex,NULL); 481661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 481761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(buffer); 4818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 481961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated = OMX_FALSE; 482061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Free the Buffer Header*/ 482161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_input_done()) { 482261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released"); 482361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer_header(); 482461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 482561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 4826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n"); 4827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 483061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 483161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_input_done()) { 4832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n"); 4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 4834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortDisable, 483561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX, 483661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 483861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 4839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // check if the buffer is valid 48406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 484161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex < drv_ctx.op_buf.actualcount) { 4842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex); 4843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Clear the bit associated with it. 4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 4845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bPopulated = OMX_FALSE; 48466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal client_buffers.free_output_buffer (buffer); 4847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 484861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 484961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_output_buffer_header(); 4850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 485161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n"); 4853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 485561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 485661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_output_done()) { 4857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n"); 4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 485961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n"); 486061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 48616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_ 486261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 486361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 486461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 486561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 48666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 486861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable, 486961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 487061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 487261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 4873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 487561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((eRet == OMX_ErrorNone) && 487661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 487761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_done()) { 4878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 4880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet, OMX_StateLoaded, 488161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 488961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 489061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::EmptyThisBuffer 4891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 489261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 489361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan This routine is used to push the encoded video frames to 489461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the video decoder. 4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 489661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 489761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 489961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 490061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went successful. 4901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 490261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 490461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 4905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 490661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret1 = OMX_ErrorNone; 490761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 4908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 490961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 491061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n"); 491161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 491261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 491461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL) { 491561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL"); 491661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 491761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 491961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_bEnabled) { 492061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled."); 492161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 492261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 492461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) { 492561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %lu", buffer->nInputPortIndex); 492661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 492761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 492961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ 493061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (iDivXDrmDecrypt) { 493161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer); 493261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drmErr != OMX_ErrorNone) { 493361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // this error can be ignored 493461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr); 493561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 493661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 493761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif //_ANDROID_ 493861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 493961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!latency) { 494061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.stop(); 494161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan latency = dec_time.processing_time_us(); 494261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 494361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 494461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 494561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 494661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 494761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_heap_ptr; 494861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 494961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 495061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_heap_ptr; 495161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 495261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 495361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 495461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = &m_inp_mem_ptr[nBufferIndex]; 495561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d", 495661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen); 495761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 495861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_mem_ptr; 495961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 496061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 496161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 496261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nBufferIndex > drv_ctx.ip_buf.actualcount ) { 496361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid"); 496461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 496561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 496661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 496761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)", 496861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen); 496961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 497061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned)hComp,(unsigned)buffer, 497161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_ETB_ARBITRARY); 497261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 497361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_TIMEINFO_EXTRADATA)) 497461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(buffer->nTimeStamp); 497561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB); 497661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 497861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 497961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 498061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/* ====================================================================== 498161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 498261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::empty_this_buffer_proxy 498361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 498461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 498561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan This routine is used to push the encoded video frames to 498661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the video decoder. 498761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 498861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 498961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 499061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 499161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 499261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went successful. 499361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 499461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 499561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 499661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 499761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 499861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int push_cnt = 0,i=0; 499961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned nPortIndex = 0; 500061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 500161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_input_frameinfo frameinfo; 500261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *temp_buffer; 500361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_seqheader seq_header; 500461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool port_setting_changed = true; 500561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool not_coded_vop = false; 500661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 500761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Should we generate a Aync error event*/ 500861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || buffer->pInputPortPrivate == NULL) { 500961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid"); 501061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 501161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 501261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 501361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 501461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 501561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex > drv_ctx.ip_buf.actualcount) { 501661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 501761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex); 501861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 501961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 502061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 502161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers++; 502261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 502361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return zero length and not an EOS buffer */ 502461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes && (buffer->nFilledLen == 0) && 502561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) { 502661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n return zero legth buffer"); 502761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 502861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 502961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 503061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 503361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) { 503461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4StreamType psBits; 503561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset); 503661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.numBytes = buffer->nFilledLen; 503761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4_headerparser.parseHeader(&psBits); 503861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan not_coded_vop = mp4_headerparser.is_notcodec_vop( 503961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 504061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (not_coded_vop) { 504161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Found Not coded vop len %lu frame number %u", 504261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen,frame_count); 504361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 504461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero"); 504561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan not_coded_vop = false; 504661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 504761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 505161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_flush_progress == true 5052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 505361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || not_coded_vop 5054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 505561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 505661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Flush in progress return buffer "); 505761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 505861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 505961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 506061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 506161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 506261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate; 506361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 506461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) { 506561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 506661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 506761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 506861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 506961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*for use buffer we need to memcpy the data*/ 507061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer->buffer_len = buffer->nFilledLen; 507161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 507261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer) { 507361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen <= temp_buffer->buffer_len) { 507461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 507561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 507661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 507761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset), 507861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen); 507961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 508061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 508161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 508261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 508361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 508461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 508561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 508661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr = temp_buffer->bufferaddr; 508761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.client_data = (void *) buffer; 508861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.datalen = temp_buffer->buffer_len; 508961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags = 0; 509061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.offset = buffer->nOffset; 509161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_fd = temp_buffer->pmem_fd; 509261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_offset = temp_buffer->offset; 509361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.timestamp = buffer->nTimeStamp; 509461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) { 509561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("ETB: dmx enabled"); 509661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_demux_entries == 0) { 509761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extract_demux_addr_offsets(buffer); 509861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 509961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 510061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries); 510161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle_demux_data(buffer); 510261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr; 510361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size; 510461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 510561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_addr = NULL; 510661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_size = 0; 510761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 510861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 510961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= buffer->nFlags; 5110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 511361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 511461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 511561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 511661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.insert_ts(buffer->nTimeStamp); 511761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 511861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 511961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.insert_ts(buffer->nTimeStamp); 512061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 512161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 512561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (inputBufferFile1) { 512661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fwrite((const char *)temp_buffer->bufferaddr, 512761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer->buffer_len,1,inputBufferFile1); 512861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 513161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { 513261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 513361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 513461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 513561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 513661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 513761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached"); 513861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= VDEC_BUFFERFLAG_EOS; 513961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 514061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count = 0; 514161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 514261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count = 0; 514361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) 514461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 514561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.flush(); 514661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 514761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = 0; 514861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 514961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 515061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 515161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 515261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 515361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&buf, 0, sizeof(buf)); 515461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&plane, 0, sizeof(plane)); 515561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 515661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned long print_count; 515761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 515861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags = V4L2_BUF_FLAG_EOS; 515961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n INPUT EOS reached \n") ; 516061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 516161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 516261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = nPortIndex; 516361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 516461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 516561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.bytesused = temp_buffer->buffer_len; 516661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.length = drv_ctx.ip_buf.buffer_size; 516761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.m.userptr = (unsigned long)temp_buffer->bufferaddr - 516861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)temp_buffer->offset; 516961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[0] = temp_buffer->pmem_fd; 517061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[1] = temp_buffer->offset; 517161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.data_offset = 0; 517261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = &plane; 517361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = 1; 517461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frameinfo.timestamp >= LLONG_MAX) { 517561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID; 517661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 517761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //assumption is that timestamp is in milliseconds 517861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.timestamp.tv_sec = frameinfo.timestamp / 1000000; 517961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000); 518061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0; 518161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 518261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 518361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 518461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver\n"); 518561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 518661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 518761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!streaming[OUTPUT_PORT]) { 518861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 518961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret,r; 519061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 519161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 5192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 519361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 519461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ret) { 519561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful \n"); 519661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[OUTPUT_PORT] = true; 519761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 519861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 519961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR(" \n Failed to call streamon on OUTPUT \n"); 520061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued"); 520161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 520261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 520361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 520461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 520561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 520661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)", 520761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen); 520861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.insert_timestamp(buffer); 5209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 521061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 5211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 521461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 521561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::FillThisBuffer 5216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 521761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 521861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL client uses this method to release the frame buffer 521961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan after displaying them. 5220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 522161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 522261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 522461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 522561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 522761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 522961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 523261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 523361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("FTB in Invalid State\n"); 523461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 523561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 523661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 523761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_bEnabled) { 523861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled."); 523961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 524061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 524161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 524261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || 524361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount)) { 524461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 524561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 524661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 524761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) { 524861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex); 524961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 525061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 525161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 525261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 525361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg); 525461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 525761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 525861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::fill_this_buffer_proxy 5259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 526061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 526161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL client uses this method to release the frame buffer 526261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan after displaying them. 5263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 526461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 526561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 526761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 526861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 527061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( 527261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 527361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 5274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 527561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE nRet = OMX_ErrorNone; 527661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 527761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned nPortIndex = 0; 527861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_fillbuffer_cmd fillbuffer; 527961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *ptr_outputbuffer = NULL; 528061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *ptr_respbuffer = NULL; 528161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 528261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 528361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 528461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) 528561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 528661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 528761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", 528861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferAdd, bufferAdd->pBuffer); 528961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Return back the output buffer to client*/ 529061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) { 529161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition"); 529261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 529361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,buffer); 529461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 529561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 529661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers++; 529761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = client_buffers.get_dr_buf_hdr(bufferAdd); 529861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate; 529961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptr_respbuffer) { 530061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data; 530161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 530261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 530361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) { 530461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 530561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 530661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,buffer); 530761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers--; 530861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 530961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 531061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 531161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 531261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 531361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 531461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&buf, 0, sizeof(buf)); 531561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 531661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 531761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 531861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = nPortIndex; 531961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 532061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 532161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].bytesused = buffer->nFilledLen; 532261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 532361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = 532461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr - 532561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset; 532661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 532761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 532861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 532961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 533061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 533161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].bytesused = 0; 533261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 533361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size); 53346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 533561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 53366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 533761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size; 533861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 533961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 534061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx); 534161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 534261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 534361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 534461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 534561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 534661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 534761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 534861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to qbuf to driver"); 534961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 535061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 535461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 535561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SetCallbacks 5356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 535761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 535861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Set the callbacks. 5359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 536061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 536161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 536361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 536461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 5365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 536661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 536861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_CALLBACKTYPE* callbacks, 536961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData) 5370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 537261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb = *callbacks; 537361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 537461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EventHandler,m_cb.FillBufferDone); 537561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_app_data = appData; 537661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 538061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 538161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentDeInit 5382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 538461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Destroys the component and release memory allocated to the heap. 5385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 538761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 539061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 539261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 5394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 539661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (iDivXDrmDecrypt) { 5397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete iDivXDrmDecrypt; 5398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt=NULL; 5399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 5401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 54026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal unsigned i = 0; 540361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_StateLoaded != m_state) { 5404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\ 540561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state); 5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED"); 540761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 540861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Playback Ended - PASSED"); 5409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the output buffers have to be cleaned up*/ 541261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Freeing the Output Memory\n"); 541461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) { 541561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_output_buffer (&m_out_mem_ptr[i]); 5416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 541761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_ 541861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 541961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 5420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the input buffers have to be cleaned up*/ 542361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr || m_inp_heap_ptr) { 5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Freeing the Input Memory\n"); 542561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) { 542661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) 542761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer (i,&m_inp_mem_ptr[i]); 542861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 542961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer (i,NULL); 5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer_header(); 5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer_header(); 543461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer) { 5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(h264_scratch.pBuffer); 5436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer = NULL; 5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 543961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_parser) { 5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete h264_parser; 544161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser = NULL; 5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 544461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_platform_list) { 5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_platform_list); 5446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = NULL; 5447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 544861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_vendor_config.pData) { 5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_vendor_config.pData); 5450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = NULL; 5451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Reset counters in mesg queues 5454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_size=0; 5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_size=0; 5456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_size=0; 5457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_read = m_ftb_q.m_write =0; 5458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_read = m_cmd_q.m_write =0; 5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_read = m_etb_q.m_write =0; 5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 546161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 546261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.reset_ts_list(); 5463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG"); 5467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 546861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // NULL); 5469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Close the driver instance"); 54706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 5471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 5472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (inputBufferFile1); 5473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 54756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (outputBufferFile1) 547661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fclose (outputBufferFile1); 5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 5479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (outputExtradataFile); 5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 548161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete"); 548261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 548661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 548761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseEGLImage 5488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 548961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 549061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use EGL Image method implementation <TBD>. 5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 549261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 549361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 549561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 549661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Not Implemented error. 5497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 549861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 550061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 550161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 550261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 550361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN void* eglImage) 5504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 550561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list; 550661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry; 550761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info; 5508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 551061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc; 551161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan EGLint fd = -1, offset = 0,pmemPtr = 0; 5512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 551361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fd = -1, offset = 0; 5514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 551561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\nuse EGL image support for decoder"); 551661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) { 551761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n "); 551861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 552061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_display_id == NULL) { 5521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Display ID is not set by IL client \n"); 5522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 552361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 552461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC) 552561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eglGetProcAddress("eglQueryImageKHR"); 552661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd); 552761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset); 552861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr); 5529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app 5530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl { 5531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int pmem_fd; 5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int offset; 5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }; 5534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl *temp_egl_id = NULL; 5535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void * pmemPtr = (void *) eglImage; 5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_egl_id = (struct temp_egl *)eglImage; 553761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_egl_id != NULL) { 5538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = temp_egl_id->pmem_fd; 5539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev offset = temp_egl_id->offset; 5540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (fd < 0) { 5543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d \n",fd); 5544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 554561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 554661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info.pmem_fd = (OMX_U32) fd; 554761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info.offset = (OMX_U32) offset; 554861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_entry.entry = (void *) &pmem_info; 554961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 555061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list.entryList = &pmem_entry; 555161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list.nEntries = 1; 555261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers = true; 555361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port, 555461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void *)&pmem_list, drv_ctx.op_buf.buffer_size, 555561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *)pmemPtr)) { 555661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("use buffer call failed for egl image\n"); 555761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 555861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 555961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 556361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 556461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentRoleEnum 5565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 556661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 556761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Component Role Enum method implementation. 5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 556961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 557061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 557261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 557361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything is successful. 557461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 557661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_U8* role, 557761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 index) 5578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 557961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 5580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 558161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 558261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 558361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 558461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 558561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 558661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 558761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 558961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 559061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 559161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 559261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 559361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 559461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 559561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 559661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 559761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 559861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 559961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 560061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 560161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n No more roles \n"); 560261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 560361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 560661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 560761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) ) { 560861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 560961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 561061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 561161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 561261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n No more roles \n"); 561361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 561461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 561561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 561661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 561761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 561861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 561961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 562061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n No more roles \n"); 562161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 562261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 562361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 562461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 562561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 562661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 562761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 562861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n No more roles \n"); 562961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 563061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 563161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 563261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 563361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 563461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 563561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 563661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 563761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 563861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n No more roles \n"); 563961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 564061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 564161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 564261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 564361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 564461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 564561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 564661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n No more roles \n"); 564761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 564861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 564961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 565061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n"); 565161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 56526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 565361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 5654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 566061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 566161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateDone 5662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 566361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 566461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if entire buffer pool is allocated by IL Client or not. 566561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Need this to move to IDLE state. 5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 566761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 566861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 567061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 567161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 567361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void) 5675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 567661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 567761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet_In = false; 567861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet_Out = false; 5679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 568061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet_In = allocate_input_done(); 568161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet_Out = allocate_output_done(); 5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 568361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bRet_In && bRet_Out) { 568461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 568561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 568761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 569061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 569161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateInputDone 5692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 569461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if I/P buffer pool is allocated by IL Client or not. 5695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 569761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 570061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 570261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void) 5704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 570561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 570661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0; 570761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 570861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr == NULL) { 570961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 571061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 571161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr ) { 571261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; i<drv_ctx.ip_buf.actualcount; i++) { 571361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 571461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 571561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 571661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 571761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 571861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == drv_ctx.ip_buf.actualcount) { 571961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 572061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 572161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 572261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) { 572361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated = OMX_TRUE; 572461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 572561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 572861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 572961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateOutputDone 5730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 573161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 573261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if entire O/P buffer pool is allocated by IL Client or not. 5733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 573461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 573561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 573761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 573861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 574061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void) 5742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 574361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 574461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned j=0; 574561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 574661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr == NULL) { 574761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 574861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 575061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 575161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j < drv_ctx.op_buf.actualcount; j++) { 575261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,j)) { 575361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 575461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 575561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 575661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 575761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 575861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j == drv_ctx.op_buf.actualcount) { 575961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 576061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 576161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_bEnabled) 576261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bPopulated = OMX_TRUE; 576361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 576561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 576961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 577061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseDone 5771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 577261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 577361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 577561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 577661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 577861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 577961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 578161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void) 5783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 578461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 5785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 578661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_input_done()) { 578761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 578861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 578961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 579161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 579661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 579761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseOutputDone 5798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 579961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 580061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 580361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 580661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void) 5810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 581161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 581261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0,j=0; 581361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 581461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr); 581561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 581661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j < drv_ctx.op_buf.actualcount ; j++) { 581761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_out_bm_count,j)) { 581861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 581961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 582061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 582161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j == drv_ctx.op_buf.actualcount) { 582261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count = 0; 582361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 582461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 582561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 582661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count = 0; 582761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 582861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 582961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 583261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 583361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseInputDone 5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 583661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 583961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 584161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 584261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 584461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void) 5846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 584761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 584861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0,j=0; 584961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 585061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 585161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) { 585261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j<drv_ctx.ip_buf.actualcount; j++) { 585361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( BITMASK_PRESENT(&m_inp_bm_count,j)) { 585461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 585561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 585661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 585761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j==drv_ctx.ip_buf.actualcount) { 585861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 585961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 586061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 586161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 586261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 586361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp, 586761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE * buffer) 5868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 586961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 587061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) { 587161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer); 587261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 587361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (output_flush_progress) { 587461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 587561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 587661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp = 0; 587761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 587861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 587961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 588061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 588261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 588361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer); 588461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers --; 5885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 588661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 588761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Output EOS has been reached"); 588861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!output_flush_progress) 588961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event((unsigned)NULL, (unsigned)NULL, 589061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EOS_DONE); 5891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 589261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame) { 589361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 589461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 589561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 589661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 589761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 589861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL, 589961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL); 590061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 590161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 590261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 590361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 590461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer); 590561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_BUFFER_LOG 590661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputBufferFile1 && buffer->nFilledLen) { 590761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int buf_index = buffer - m_out_mem_ptr; 590861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int stride = drv_ctx.video_resolution.stride; 590961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int scanlines = drv_ctx.video_resolution.scan_lines; 591061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; 591161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i; 591261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bytes_written = 0; 591361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) { 591461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1); 591561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp += stride; 591661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 591761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines; 591861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int stride_c = stride; 591961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) { 592061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1); 592161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp += stride_c; 592261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 592361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 592561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 592661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* For use buffer we need to copy the data */ 592761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!output_flush_progress) { 592861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.get_next_timestamp(buffer, 592961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 593061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 593161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 593261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 593361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_TICKS expected_ts = 0; 593461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.pop_min_ts(expected_ts); 593561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list", 593661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp, expected_ts); 593761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 593861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nTimeStamp != expected_ts) { 593961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check"); 594061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 594161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 594261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 594461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_cb.FillBufferDone) { 594561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen > 0) { 594661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle_extradata(buffer); 594761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) 594861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep min timestamp interval to handle corrupted bit stream scenario 594961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(buffer->nTimeStamp); 595061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (arbitrary_bytes) 595161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan adjust_timestamp(buffer->nTimeStamp); 595261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 595361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!proc_frms) { 595461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.stop(); 595561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan latency = dec_time.processing_time_us() - latency; 595661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3); 595761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 595861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fps_metrics.start(); 595961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 596061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms++; 596161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 596261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U64 proc_time = 0; 596361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fps_metrics.stop(); 596461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_time = fps_metrics.processing_time_us(); 596561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)", 596661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms, (float)proc_time / 1e6, 596761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)(1e6 * proc_frms) / proc_time); 596861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms = 0; 596961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 597061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 597161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 597261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_EXTRADATA_LOG 597361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputExtradataFile) { 597461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 597561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 597661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) 597761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned)(buffer->pBuffer + buffer->nOffset + 597861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen + 3)&(~3)); 597961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (p_extra && 598061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) { 598161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType); 598261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fwrite (p_extra,1,p_extra->nSize,outputExtradataFile); 598361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p_extra->eType == OMX_ExtraDataNone) { 598461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 598561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 598661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 598761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 598861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 598961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 599061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 599161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 599261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 599361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 599461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 599561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 599661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 599761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((OMX_QCOM_PLATFORM_PRIVATE_LIST *) 599861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->pPlatformPrivate)->entryList->entry; 599961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd); 600061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *il_buffer; 600161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan il_buffer = client_buffers.get_il_buf_hdr(buffer); 600261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (il_buffer) 600361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,il_buffer); 600461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 600561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr"); 600661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 600761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 600861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd); 600961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 601061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 60116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 6012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 601361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp, 601761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* buffer) 6018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 602061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) { 6021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer); 602261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 602661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer); 6027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_input_buffers--; 6028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 602961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 603061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL && input_flush_progress == false) { 603161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer); 603261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = buffer; 603361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 603461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp = LLONG_MAX; 603561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan push_input_buffer (hComp); 603661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 603761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer); 603861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 603961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)buffer, 604061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 604161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error"); 604261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 604461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_cb.EmptyBufferDone) { 6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 604661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 6048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 6050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message) 6055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 605661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec* omx = NULL; 605761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo *vdec_msg = NULL; 605861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omxhdr = NULL; 605961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer *v4l2_buf_ptr = NULL; 606061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *output_respbuf = NULL; 606161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc=1; 606261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (context == NULL || message == NULL) { 606361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check"); 606461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 606561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 606661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg = (struct vdec_msginfo *)message; 606761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 606861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = reinterpret_cast<omx_vdec*>(context); 606961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 607061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (vdec_msg->msgcode) { 607161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 607261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_HW_ERROR: 607361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 607461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 607561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 607661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 607761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_START_DONE: 607861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 607961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_START_DONE); 608061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 608161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 608261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_STOP_DONE: 608361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 608461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 608561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 608661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 608761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_RESUME_DONE: 608861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 608961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_RESUME_DONE); 609061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 609161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 609261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_PAUSE_DONE: 609361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 609461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PAUSE_DONE); 609561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 609661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 609761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 609861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 609961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 610061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 610161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 610261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 610361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 610461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 610561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_FLUSHED: 610661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 610761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 610861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* omxhdr = (OMX_BUFFERHEADERTYPE* ) 610961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.input_frame_clientdata; */ 611061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 611161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata; 611261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index; 611361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr == NULL || 611461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) { 611561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr = NULL; 611661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->status_code = VDEC_S_EFATAL; 611761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 611861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 611961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code, 612061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 612161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 612261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_INFO_FIELD_DROPPED: 612361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int64_t *timestamp; 612461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan timestamp = (int64_t *) malloc(sizeof(int64_t)); 612561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (timestamp) { 612661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *timestamp = vdec_msg->msgdata.output_frame.time_stamp; 612761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)timestamp, vdec_msg->status_code, 612861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED); 612961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld", 613061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.time_stamp); 613161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 613261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 613361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_FLUSHED: 613461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 613561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 613661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data; 613761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index; 613861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)", 613961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr, vdec_msg->msgdata.output_frame.time_stamp, 614061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.pic_type); 614161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 614261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr && omxhdr->pOutputPortPrivate && 614361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) && 614461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate 614561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) { 614661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) { 614761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len; 614861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset; 614961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp; 615061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags; 615161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 615261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS) { 615361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_EOS; 615461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //rc = -1; 615561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 615661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) { 615761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 615861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 615961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.bufferaddr = 616061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr; 616161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft != 616261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.framesize.left) 616361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top) 616461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right) 616561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) { 616661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left; 616761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top; 616861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right; 616961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom; 617061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Crop information has changed\n"); 617161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop, 617261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PORT_RECONFIG); 617361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 617461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf = (struct vdec_output_frameinfo *)\ 617561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->pOutputPortPrivate; 617661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->len = vdec_msg->msgdata.output_frame.len; 617761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->offset = vdec_msg->msgdata.output_frame.offset; 617861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) { 617961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_I; 618061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 618161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) { 618261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_P; 618361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 618461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) { 618561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_B; 618661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 618761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 618861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->output_use_buffer) 618961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ( omxhdr->pBuffer, (void *) 619061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr + 619161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)vdec_msg->msgdata.output_frame.offset), 619261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.len); 619361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 619461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFilledLen = 0; 619561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code, 619661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_FBD); 619761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) 619861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 619961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EOS_DONE); 620061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 620161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 620261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 620361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 620461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_CONFIG_CHANGED: 620561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Port settings changed"); 620661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition, 620761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PORT_RECONFIG); 620861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 620961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_INFO_CONFIG_CHANGED: 621061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 621161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Port settings changed info"); 621261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // get_buffer_req and populate port defn structure 621361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 621461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 621561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret; 621661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 621761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 621861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height); 621961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline; 622061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.scan_lines = fmt.fmt.pix_mp.plane_fmt[0].reserved[0]; 622161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->m_port_def.nPortIndex = 1; 622261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->update_portdef(&(omx->m_port_def)); 622361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 622461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG); 622561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 622661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 622761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 622861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 622961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 623061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 6231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary ( 623461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_HANDLETYPE hComp, 623561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer 623661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 6237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 623861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 623961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Empty this arbitrary"); 624061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 624161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL) { 624261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 624361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 624461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 624561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u", 624661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp); 624761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 624861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return zero length and not an EOS buffer */ 624961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return buffer if input flush in progress */ 625061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) && 625161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) { 625261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress"); 625361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,buffer); 625461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 625561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 625661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 625761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame == NULL) { 625861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp); 625961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = buffer; 626061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Try to Push One Input Buffer "); 626161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan push_input_buffer (hComp); 626261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 626361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer); 626461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL, 626561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL)) { 626661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 626761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 626861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 626961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 627061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp) 6275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 627661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 627761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 627861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 627961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL || psource_frame == NULL) { 628061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we have a destination buffer*/ 628161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL) { 628261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue"); 628361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 628461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 628561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *)address; 628661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 628761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 628861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame); 628961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 629061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 629161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 629261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we have a destination buffer*/ 629361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame == NULL) { 629461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Get a source buffer from the queue"); 629561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 629661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 629761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *)address; 629861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame, 629961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nTimeStamp); 630061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d", 630161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 630261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 630361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 630461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 630561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 630661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 630761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 630861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while ((pdest_frame != NULL) && (psource_frame != NULL)) { 630961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (codec_type_parse) { 631061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_MPEG4: 631161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_H263: 631261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_MPEG2: 631361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_sc_codec(hComp); 631461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 631561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_H264: 631661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_h264(hComp); 631761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 631861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_HEVC: 631961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_hevc(hComp); 632061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 632161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_VC1: 632261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_vc1(hComp); 632361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 632461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 632561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 632661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 632761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret != OMX_ErrorNone) { 632861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed"); 632961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 633061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 633161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 633261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 633361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 633461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 6335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp) 6338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 633961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 634061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 634161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 6342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 634361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d", 634461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame,psource_frame->nTimeStamp); 634561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 634661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,&partial_frame) == -1) { 634761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Error In Parsing Return Error"); 634861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 635061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 635161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 635261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d", 635361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,psource_frame,frame_count); 635461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 635561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 635661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp); 635761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*First Parsed buffer will have only header Hence skip*/ 635861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frame_count == 0) { 635961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame "); 636061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 636161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_MPEG4 || 636261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse == CODEC_TYPE_DIVX) { 636361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4StreamType psBits; 636461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset; 636561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.numBytes = pdest_frame->nFilledLen; 636661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4_headerparser.parseHeader(&psBits); 636761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 636861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 636961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 637061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 637161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 637261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen) { 637361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 637461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 637561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 637661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 637761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 637861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 637961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 638061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 638161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 638261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 638361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 638461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 638561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) { 638661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL"); 638761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL, 638861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL); 638961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 639061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 639161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 639261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 639361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen); 639461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 639561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nAllocLen == 639661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen + pdest_frame->nOffset) { 639761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled"); 639861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 639961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 640061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 640161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 640261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen == 0) { 640361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 640461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 640561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags |= psource_frame->nFlags; 640661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x", 640761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 640861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d", 640961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,frame_count++); 641061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 641161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 641261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 641361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 641461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 641561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 641661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 641761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Last frame in else dest addr") ; 641861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 641961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 642061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 642161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd) { 642261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame); 642361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 642461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 642561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 642661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 642761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame); 642861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 642961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 643061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame, 643161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nTimeStamp); 643261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d", 643361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 643461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 643661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 643761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp) 6441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 644261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 644361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 644461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL isNewFrame = OMX_FALSE; 644561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 644661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 644761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 644861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated"); 644961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 645161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d " 645261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal); 645361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 645461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen && look_ahead_nal) { 645561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 645661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 645761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 6458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 6459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer,h264_scratch.nFilledLen); 6460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += h264_scratch.nFilledLen; 646161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame"); 6462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 646361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 646461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264"); 6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 646761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 646861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length == 0) { 646961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code"); 647061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 647161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 647261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Error In Parsing Return Error"); 6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 647561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 647661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length); 647761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_h264_nallength(psource_frame, 647861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 647961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error"); 648061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 648261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 648461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 648561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 648661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip"); 648761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 648861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 648961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFlags = psource_frame->nFlags; 649061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 649161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen); 649261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen) { 649361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen, 649461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NALU_TYPE_SPS); 6495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 649661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) 649761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 649861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, NALU_TYPE_SEI); 649961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 650061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // If timeinfo is present frame info from SEI is already processed 650161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 650261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, NALU_TYPE_SEI); 650361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 650461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 650561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 650661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) { 650761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_last_au_ts; 650861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_last_au_flags; 650961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef PANSCAN_HDLR 651061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 651161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->update_panscan_data(h264_last_au_ts); 651261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 651361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 651461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR || 651561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) { 651661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = h264_scratch.nTimeStamp; 651761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = h264_scratch.nFlags; 651861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 651961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 652061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts); 652161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!VALID_TS(h264_last_au_ts)) 652261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = ts_in_sei; 652361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 652461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 652561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 652661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 652761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 652861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 652961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!isNewFrame) { 653061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 653161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 653261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d", 653361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen); 653461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 653561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 653661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 653761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ) 653861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 653961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 654061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 654161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264"); 654261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 654361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 654461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 654561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = true; 654661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x", 654761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 654861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d", 654961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,frame_count++); 655061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 655161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen == 0) { 655261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it"); 655361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 655461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 655561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 655661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 655761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 655861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 655961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 656061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 656161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264"); 656261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 656361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 656461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 656561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 656661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Reset the EOS Flag"); 656761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 656861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 656961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 657061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 657161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 657261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 657361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //frame_count++; 657461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 657561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 657661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 657761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 657861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame); 657961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 658061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = 0; 658161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 658261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 658361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 658461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 658561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 658661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 658761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 658861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 658961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nAllocLen == 659061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen + h264_scratch.nOffset) { 659161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled"); 659261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 6593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 659461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 659561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 659661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!psource_frame->nFilledLen) { 659761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame); 659861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 659961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 660061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 660161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer"); 660261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 660361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 660461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 660561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 660661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 660761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 660861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 660961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264"); 661061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 661161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 661261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 661361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 661461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 661561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%d TimeStamp = %x", 661661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 661761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++); 661861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 661961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 662061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp); 662161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!VALID_TS(pdest_frame->nTimeStamp)) 662261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = ts_in_sei; 662361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 662561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 662661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 662761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 662861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 662961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 663061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 663161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 663261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d", 663361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,h264_scratch.nFilledLen); 663461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 663561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 663661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 663761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 663861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd && !psource_frame->nFilledLen) { 663961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 664061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 664161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 664261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame); 664361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 664461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 664561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d", 664661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 664761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 664861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 664961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66526eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc) 6653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 66546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_ERRORTYPE rc = OMX_ErrorNone; 665561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) { 66566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memcpy ((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen); 665761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pDst->nTimeStamp == LLONG_MAX || pDst->nTimeStamp == 0) { 66586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pDst->nTimeStamp = pSrc->nTimeStamp; 66596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_LOW("Assign Dst nTimeStamp=%lld", pDst->nTimeStamp); 6660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 66616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pDst->nFilledLen += pSrc->nFilledLen; 66626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pSrc->nFilledLen = 0; 666361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_ERROR("Error: Destination buffer overflow\n"); 66656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rc = OMX_ErrorBadParameter; 6666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 66676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return rc; 6668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66706eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_hevc (OMX_HANDLETYPE hComp) 6671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 667261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 667361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 667461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL isNewFrame = OMX_FALSE; 667561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 667661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE rc = OMX_ErrorNone; 667761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 667861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 667961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:Hevc Scratch Buffer not allocated"); 668061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 66816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 668261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 668361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 668461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("h264_scratch.nFilledLen %d has look_ahead_nal %d pdest_frame nFilledLen %d nTimeStamp %lld\n", 668561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 668661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 668761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen && look_ahead_nal) { 668861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 668961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 669061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // copy the lookahead buffer in the scratch 66916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rc = copy_buffer(pdest_frame, &h264_scratch); 669261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc != OMX_ErrorNone) { 669361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 669461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 669561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 669661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length == 0) { 669761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 669861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 669961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Error In Parsing Return Error"); 67006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 67016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 670261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 670361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d\n",nal_length); 670461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_h264_nallength(psource_frame, 670561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 670661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error"); 67076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 670861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 670961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 671061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 671161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 671261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 671361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip"); 671461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 671561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 671661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFlags = psource_frame->nFlags; 671761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 671861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen); 671961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen) { 672061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame); 672161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 672261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 672361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 672461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!isNewFrame) { 672561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %d nTimestamp %lld, pdest_frame nFilledLen %d nTimestamp %lld\n", 672661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 672761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 672861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone) { 672961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 673061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 673161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 673261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = true; 673361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen == 0) { 673461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 673561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer\n"); 673661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 673761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone ) { 673861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 673961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 674061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 674161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 674261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 674361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 674461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 674561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %d nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %d nTimeStamp %lld \n", 674661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 674761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 674861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 674961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 675061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 675161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 675261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 675361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 675461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("pop the next pdest_buffer %p\n",pdest_frame); 675561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 675661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = 0; 675761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 675861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 675961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 676061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 676161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 676261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 676361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %d nTimeStamp %lld, pdest_frame nFilledLen %d nTimeStamp %lld, h264_scratch nFilledLen %d nTimeStamp %lld \n", 676461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 676561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 676661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 676761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nAllocLen == 676861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen + h264_scratch.nOffset) { 676961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled"); 677061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 677161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 677261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 677361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 677461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!psource_frame->nFilledLen) { 677561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client\n",psource_frame); 677661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 677761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 677861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 677961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer\n"); 678061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 678161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone ) { 678261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 678361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 678461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 678561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 678661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 678761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%d TimeStamp = %lld\n", 678861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count, pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 678961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 679061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 679161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 679261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 679361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 679461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 679561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 679661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 679761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d", 679861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,h264_scratch.nFilledLen); 679961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 680061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 680161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 680261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 680361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd && !psource_frame->nFilledLen) { 680461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 680561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 680661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 680761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 680861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 680961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d nFilledLen %d, nTimeStamp %lld\n", 681061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp); 681161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 681261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 681361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 68146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 68156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68166eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp) 68176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 68186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U8 *buf, *pdest; 68196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U32 partial_frame = 1; 68206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U32 buf_len, dest_len; 68216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 682261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (first_frame == 0) { 68236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal first_frame = 1; 68246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n"); 682561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_vendor_config.pData) { 68266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n"); 68276eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buf = psource_frame->pBuffer; 68286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buf_len = psource_frame->nFilledLen; 68296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) == 683161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE) { 68326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_vc1_profile = VC1_SP_MP_RCV; 683361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) { 68346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_vc1_profile = VC1_AP; 683561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n"); 68376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorStreamCorrupt; 68386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 683961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen + 68416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest_frame->nOffset; 68426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen + 684361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nOffset); 68446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 684561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dest_len < m_vendor_config.nDataSize) { 68466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_ERROR("\nDestination buffer full\n"); 68476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 684861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize); 68506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest_frame->nFilledLen += m_vendor_config.nDataSize; 68516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 685561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (m_vc1_profile) { 68566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case VC1_AP: 68576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code"); 685861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (push_input_sc_codec(hComp) != OMX_ErrorNone) { 68596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code"); 68606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 68616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 686261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 68636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case VC1_SP_MP_RCV: 68656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal default: 68666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode\n"); 68676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 68686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorNone; 68706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 68716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 687261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef USE_ION 687361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 687461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 alignment) 687561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 687661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct pmem_allocation allocation; 687761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.size = buffer_size; 687861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align = clip2(alignment); 687961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocation.align < 4096) { 688061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align = 4096; 688161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 688261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) { 688361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)", 688461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align, allocation.size); 688561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 688661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 688761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return true; 688861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 688961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 689061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 68916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 68926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size, 689361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 alignment, struct ion_allocation_data *alloc_data, 689461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_fd_data *fd_data, int flag) 68956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 689661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fd = -EINVAL; 689761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = -EINVAL; 689861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ion_dev_flag; 689961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ion ion_buf_info; 690061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!alloc_data || buffer_size <= 0 || !fd_data) { 690161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n"); 690261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -EINVAL; 690361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 690461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_dev_flag = O_RDONLY; 690561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = open (MEM_DEVICE, ion_dev_flag); 690661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 690761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd); 690861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return fd; 690961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 691061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags = 0; 691161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (flag & ION_FLAG_CACHED)) { 691261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags |= ION_FLAG_CACHED; 691361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 691461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->len = buffer_size; 691561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->align = clip2(alignment); 691661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (alloc_data->align < 4096) { 691761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->align = 4096; 691861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 691961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((secure_mode) && (flag & ION_SECURE)) 692061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags |= ION_SECURE; 692161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 692261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_ 692361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->heap_mask = ION_HEAP(ION_ADSP_HEAP_ID); 692461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else 692561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID); 692661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 692761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 692861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID); 692961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 693061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 693161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc || !alloc_data->handle) { 693261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n ION ALLOC memory failed "); 693361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->handle = NULL; 693461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(fd); 693561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = -ENOMEM; 693661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return fd; 693761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 693861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd_data->handle = alloc_data->handle; 693961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd,ION_IOC_MAP,fd_data); 694061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 694161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n ION MAP failed "); 694261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.ion_alloc_data = *alloc_data; 694361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.ion_device_fd = fd; 694461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.fd_ion_data = *fd_data; 694561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&ion_buf_info); 694661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd_data->fd =-1; 694761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(fd); 694861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = -ENOMEM; 694961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 695061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 6952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 695461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) 6955dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{ 695661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 695761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!buf_ion_info) { 695861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata"); 695961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 696061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 696161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 696261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &buf_ion_info->ion_alloc_data.handle)) { 696361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n ION: free failed" ); 696461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 696561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(buf_ion_info->ion_device_fd); 696661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->ion_device_fd = -1; 696761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->ion_alloc_data.handle = NULL; 696861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->fd_ion_data.fd = -1; 6969dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand} 6970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header() 6972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 697361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released"); 697461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_use_buffer = false; 697561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers = false; 697661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 697761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 697861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_out_mem_ptr); 697961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 698061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 698161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 698261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_platform_list) { 698361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_platform_list); 698461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = NULL; 698561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 698661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 698761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 698861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_respbuffer); 698961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 699061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 699161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 699261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_outputbuffer); 699361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 699461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 6996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 6997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free o/p ion context"); 699861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 6999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 7000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header() 7005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_use_buffer = false; 700761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 700861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) { 700961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free utils parser"); 701061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan delete (m_frame_parser.mutils); 701161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils = NULL; 701261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 701361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 701461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr) { 701561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free input Heap Pointer"); 701661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_inp_heap_ptr); 701761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = NULL; 701861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 701961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 702061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) { 702161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free input pmem header Pointer"); 702261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_phdr_pmem_ptr); 702361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = NULL; 702461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 702561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 702661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) { 702761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free input pmem Pointer area"); 702861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_inp_mem_ptr); 702961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr = NULL; 703061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 703161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer) { 703261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free Driver Context pointer"); 703361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_inputbuffer); 703461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer = NULL; 7035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ip_buf_ion_info) { 7038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free ion context"); 703961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ip_buf_ion_info); 7040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info = NULL; 7041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 70446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 70456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::stream_off(OMX_U32 port) 7046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 704761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type btype; 704861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 704961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_ports v4l2_port = OUTPUT_PORT; 705061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 705161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 705261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 705361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_port = OUTPUT_PORT; 705461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 705561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 705661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_port = CAPTURE_PORT; 705761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_ALL) { 705861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX); 705961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 706061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 706161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!rc_input) 706261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc_input; 706361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 706461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc_output; 706561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 706661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 706761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!streaming[v4l2_port]) { 706861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // already streamed off, warn and move on 706961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port," 707061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " which is already streamed off", v4l2_port); 707161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 0; 707261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 707361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 707461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port); 707561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 707661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype); 707761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 707861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 707961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port \n", v4l2_port); 708061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 708161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[v4l2_port] = false; 708261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 708361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 708461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 708561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 708661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 708761a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop) 708861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 708961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 709061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 709161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0; 709261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 709361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret = 0; 709461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 709561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 709661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = 1; 709761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 709861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 709961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 710061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 710161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 710261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 710361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 710461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 710561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 710661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 710761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 710861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet==OMX_ErrorNone) { 710961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 711061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 711161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 711261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 711361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 711461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 711561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 711661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 711761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount = bufreq.count; 711861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->mincount = bufreq.count; 711961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count); 712061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 712161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)", 712261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type); 712361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 712461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 712561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 712661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 712761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 712861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 712961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height); 713061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 713161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes; 713261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage); 713361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 713461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 713561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 713661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 713761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 713861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 713961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 714061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 714161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = buffer_prop->buffer_size; 714261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 714361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 714461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 714561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 714661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx); 714761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 714861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 714961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_FRAMEINFO_EXTRADATA) { 715061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Frame info extra data enabled!"); 715161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE; 715261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 715361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_INTERLACE_EXTRADATA) { 715461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE; 715561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 715661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_PORTDEF_EXTRADATA) { 715761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE; 715861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n", 715961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size); 716061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 716161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extra_data_size) { 716261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator 716361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit 716461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 716561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size; 716661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.count = buffer_prop->actualcount; 716761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.buffer_size = extra_data_size; 716861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size += client_extra_data_size; 716961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 717061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)", 717161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type); 717261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (in_reconfig) // BufReq will be set to driver when port is disabled 717361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = buf_size; 717461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (buf_size != buffer_prop->buffer_size) { 717561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = buf_size; 717661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(buffer_prop); 717761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 717861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 717961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)\n", 718061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type); 718161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 718461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop) 718561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 718661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 718761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned buf_size = 0; 718861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 718961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 719061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret; 719161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)", 719261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size); 719361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 719461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_size != buffer_prop->buffer_size) { 719561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)", 719661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size, buf_size); 719761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 719861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 719961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 720061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 720161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 720261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 720361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 720461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 720561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 720661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 720761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 720861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 720961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 721061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 721161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 721261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 721361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 721461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 721561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret); 721661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 721761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 721861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 721961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 722061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = buffer_prop->actualcount; 722161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 722261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 722361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 722461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 722561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 722661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 722761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 722961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet==OMX_ErrorNone) { 723061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 723161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 723261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 723361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 723461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret); 723561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 723661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 723761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (bufreq.count < buffer_prop->actualcount) { 723861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Driver refused to change the number of buffers" 723961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " on v4l2 port %d to %d (prefers %d)", bufreq.type, 724061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, bufreq.count); 724161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 724261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 724361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.update_buffer_req()) { 724461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed"); 724561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 724661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 724761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 724861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 724961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!eRet && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 725061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // need to update extradata buffers also 725161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size; 725261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.count = buffer_prop->actualcount; 725361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 725461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7255dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand} 7256dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 7257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution() 7258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 725961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 726061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 7264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 726561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 726661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!portDefn) { 726761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 726861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 726961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("omx_vdec::update_portdef\n"); 727061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 727161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nSize = sizeof(portDefn); 727261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDomain = OMX_PortDomainVideo; 727361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator > 0) 727461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator / 727561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator; 727661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 727761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Error: Divide by zero \n"); 727861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 7279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 728061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portDefn->nPortIndex) { 728161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirInput; 728261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 728361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 728461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 728561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused; 728661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eCompressionFormat = eCompressionFormat; 728761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bEnabled = m_inp_bEnabled; 728861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bPopulated = m_inp_bPopulated; 728961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (1 == portDefn->nPortIndex) { 729061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buf_size = 0; 729161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.update_buffer_req()) { 729261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed"); 729361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 729461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 729561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_buffer_req(buf_size)) { 729661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n update buffer requirements"); 729761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 729861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 729961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize = buf_size; 730061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirOutput; 730161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 730261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 730361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 730461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bEnabled = m_out_bEnabled; 730561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bPopulated = m_out_bPopulated; 730661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) { 730761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Error in getting color format"); 730861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 730961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 731061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 731161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirMax; 731261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 731361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->nPortIndex); 731461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 731561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 731661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height; 731761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width; 731861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride = drv_ctx.video_resolution.stride; 731961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines; 732061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld" 732161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " SliceHeight = %lu \n", portDefn->format.video.nFrameWidth, 732261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight, 732361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride, 732461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight); 732561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers() 7330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 733161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 733261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr = NULL; 733361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; 733461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 733561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 733661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation"); 733761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nBufHdrSize = 0; 733861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformEntrySize = 0; 733961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformListSize = 0; 734061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPMEMInfoSize = 0; 734161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 734261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 734361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 734461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 734561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n", 734661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 734761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufHdrSize = drv_ctx.op_buf.actualcount * 734861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE); 734961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 735061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize = drv_ctx.op_buf.actualcount * 735161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 735261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize = drv_ctx.op_buf.actualcount * 735361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 735461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformEntrySize = drv_ctx.op_buf.actualcount * 735561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 735661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 735761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize, 735861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE), 735961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize, 736061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize); 736161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize, 736261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count); 736361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 736461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Alloc mem for platform specific info 736561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *pPtr=NULL; 736661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 736761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize,1); 736861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \ 736961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_bufferpayload), 737061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 737161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 737261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo), 737361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 7374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 737561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \ 737661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount); 7377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 737961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 738061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_respbuffer) { 738161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr = m_out_mem_ptr; 738261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 738361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 738461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_list) + nPlatformListSize); 738561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 738661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_entry) + nPlatformEntrySize); 738761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList = m_platform_list; 738861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry = m_platform_entry; 738961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = m_pmem_info; 739061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 739161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr); 739261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 739361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Settting the entire storage nicely 739461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, 739561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr,pPlatformEntry); 739661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo); 739761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 739861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 739961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 740061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Set the values when we determine the right HxW param 740161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nAllocLen = 0; 740261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nFilledLen = 0; 740361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pAppPrivate = NULL; 740461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 740561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 740661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->entry = pPMEMInfo; 740761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform List 740861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->nEntries = 1; 740961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->entryList = pPlatformEntry; 741061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep pBuffer NULL till vdec is opened 741161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pBuffer = NULL; 741261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->offset = 0; 741361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->pmem_fd = 0; 741461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pPlatformPrivate = pPlatformList; 741561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 7416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 741761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 7418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 741961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create a mapping between buffers*/ 742061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 742161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 742261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ptr_outputbuffer[i]; 742361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the buffer and buffer header pointers 742461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr++; 742561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo++; 742661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry++; 742761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList++; 742861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 742961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 743061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\ 743161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr, pPtr); 743261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 743361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_out_mem_ptr); 743461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 743561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 743661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pPtr) { 743761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(pPtr); 743861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = NULL; 743961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 744061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 744161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_outputbuffer); 744261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 744361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 744461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 744561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_respbuffer); 744661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 744761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 744961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info) { 745061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("\n Free o/p ion context"); 745161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 745261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = NULL; 745361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 745561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 745661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 745761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 745861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 7459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 746061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs() 7464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 746561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1; 746661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2; 746761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident; 746861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_cmd_queue tmp_q, pending_bd_q; 746961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 747061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // pop all pending GENERATE FDB from ftb queue 747161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_ftb_q.m_size) { 747261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.pop_entry(&p1,&p2,&ident); 747361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_FBD) { 747461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.insert_entry(p1,p2,ident); 747561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 747661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.insert_entry(p1,p2,ident); 747761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 747961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //return all non GENERATE FDB to ftb queue 748061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (tmp_q.m_size) { 748161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.pop_entry(&p1,&p2,&ident); 748261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.insert_entry(p1,p2,ident); 748361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 748461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // pop all pending GENERATE EDB from etb queue 748561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_etb_q.m_size) { 748661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 748761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_EBD) { 748861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.insert_entry(p1,p2,ident); 748961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 749061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.insert_entry(p1,p2,ident); 749161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 749261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 749361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //return all non GENERATE FDB to etb queue 749461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (tmp_q.m_size) { 749561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.pop_entry(&p1,&p2,&ident); 749661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.insert_entry(p1,p2,ident); 749761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 749861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 749961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // process all pending buffer dones 750061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (pending_bd_q.m_size) { 750161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.pop_entry(&p1,&p2,&ident); 750261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (ident) { 750361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EBD: 750461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 750561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n"); 750661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 750761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 750861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 750961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 751061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FBD: 751161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 751261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n"); 751361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 751461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 751561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 751661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp) 7521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 752261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 new_frame_interval = 0; 752361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 752461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) { 752561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan new_frame_interval = (act_timestamp > prev_ts)? 752661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp - prev_ts : 752761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts - act_timestamp; 752861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (new_frame_interval < frm_int || frm_int == 0) { 752961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = new_frame_interval; 753061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frm_int) { 753161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 1e6; 753261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = frm_int; 753361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)", 753461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int, drv_ctx.frame_rate.fps_numerator / 753561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)drv_ctx.frame_rate.fps_denominator); 753661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 753761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 753861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 753961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 7540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp) 7543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 754461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rst_prev_ts && VALID_TS(act_timestamp)) { 754561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 754661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = false; 754761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (VALID_TS(prev_ts)) { 754861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool codec_cond = (drv_ctx.timestamp_adjust)? 754961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)? 755061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)): 755161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!VALID_TS(act_timestamp) || act_timestamp == prev_ts); 755261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frm_int > 0 && codec_cond) { 755361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 755461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp = prev_ts + frm_int; 755561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 755661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 755761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 755861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(act_timestamp); 755961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (frm_int > 0) // In this case the frame rate was set along 756061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { // with the port definition, start ts with 0 756161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 756261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 7563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 756861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL; 756961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_conceal_MB = 0; 757061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 frame_rate = 0; 757161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int consumed_len = 0; 757261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_MB_in_frame; 757361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 recovery_sei_flags = 1; 757461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int buf_index = p_buf_hdr - m_out_mem_ptr; 757561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_panscan_window_payload *panscan_payload = NULL; 757661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) + 757761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nOffset; 757861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.extradata_info.uaddr) { 757961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 758061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 758161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) 758261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3)); 758361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size; 758461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen)) 758561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = NULL; 758661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata; 758761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (data) { 758861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while ((consumed_len < drv_ctx.extradata_info.buffer_size) 758961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && (data->eType != (OMX_EXTRADATATYPE)EXTRADATA_NONE)) { 759061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) { 759161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Invalid extra data size"); 759261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 759361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 759461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)data->eType) { 759561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case EXTRADATA_INTERLACE_VIDEO: 759661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_interlace_payload *payload; 759761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan payload = (struct msm_vidc_interlace_payload *)data->data; 759861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (payload->format != INTERLACE_FRAME_PROGRESSIVE) { 759961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int enable = 1; 760061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 mbaff = 0; 760161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mbaff = (h264_parser)? (h264_parser->is_mbaff()): false; 760261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((payload->format == INTERLACE_FRAME_PROGRESSIVE) && !mbaff) 760361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 760461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 760561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 760661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) 760761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 760861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PP_PARAM_INTERLACED, (void*)&enable); 760961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 761061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) { 761161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_interlace_extradata(p_extra, payload->format); 761261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 761361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 761461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 761561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case EXTRADATA_FRAME_RATE: 761661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_framerate_payload *frame_rate_payload; 761761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data; 761861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_rate = frame_rate_payload->frame_rate; 761961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 762061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case EXTRADATA_TIMESTAMP: 762161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_ts_payload *time_stamp_payload; 762261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_payload = (struct msm_vidc_ts_payload *)data->data; 762361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo; 762461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32); 762561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 762661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case EXTRADATA_NUM_CONCEALED_MB: 762761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_concealmb_payload *conceal_mb_payload; 762861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data; 762961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 763061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_height + 15)) >> 8; 763161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0); 763261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 763361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case EXTRADATA_ASPECT_RATIO: 763461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload; 763561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)data->data; 763661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((struct vdec_output_frameinfo *) 763761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width; 763861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((struct vdec_output_frameinfo *) 763961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height; 764061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 764161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case EXTRADATA_RECOVERY_POINT_SEI: 764261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_recoverysei_payload *recovery_sei_payload; 764361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data; 764461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan recovery_sei_flags = recovery_sei_payload->flags; 764561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (recovery_sei_flags != FRAME_RECONSTRUCTION_CORRECT) { 764661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 764761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received\n"); 764861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 764961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 765061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case EXTRADATA_PANSCAN_WINDOW: 765161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data; 765261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 765361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 765461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto unrecognized_extradata; 765561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 765661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan consumed_len += data->nSize; 765761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 765861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 765961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 766061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 766161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_frame_info_extradata(p_extra, 766261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate, 766361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_payload,&((struct vdec_output_frameinfo *) 766461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info); 766561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 766661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 76676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunrecognized_extradata: 766861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && client_extradata) 766961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_terminator_extradata(p_extra); 767061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 76736eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, 767461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool is_internal, bool enable) 7675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 767661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 767761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 767861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state != OMX_StateLoaded) { 767961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 768061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 768161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 768261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d\n", 768361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata, requested_extradata, enable, is_internal); 768461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 768561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!is_internal) { 768661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enable) 768761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata |= requested_extradata; 768861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 768961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata = client_extradata & ~requested_extradata; 769061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 769161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 769261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enable) { 769361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (requested_extradata & OMX_INTERLACE_EXTRADATA) { 769461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 769561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO; 769661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 769761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set interlaced extradata." 769861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Quality of interlaced clips might be impacted.\n"); 769961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 770061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) { 770161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 770261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE; 770361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 770461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set framerate extradata\n"); 770561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 770661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 770761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB; 770861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 770961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set concealed MB extradata\n"); 771061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 771161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 771261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI; 771361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 771461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata\n"); 771561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 771661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 771761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW; 771861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 771961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set panscan extradata\n"); 772061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 772161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 772261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO; 772361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 772461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set panscan extradata\n"); 772561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 772661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) { 772761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 772861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP; 772961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 773061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set timeinfo extradata\n"); 773161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 773261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 773361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 773461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = get_buffer_req(&drv_ctx.op_buf); 773561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 7736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 774061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0; 774161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *data_ptr = extra->data, data = 0; 774261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (byte_count < extra->nDataSize) { 774361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data = *data_ptr; 774461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (data) { 774561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB += (data&0x01); 774661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data >>= 1; 774761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 774861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data_ptr++; 774961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan byte_count++; 775061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 775161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 775261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_height + 15)) >> 8; 775361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0); 7754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 775861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_debug_extradata) 775961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 776261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "============== Extra Data ==============\n" 776361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Size: %lu \n" 776461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Version: %lu \n" 776561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " PortIndex: %lu \n" 776661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Type: %x \n" 776761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " DataSize: %lu \n", 776861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize, extra->nVersion.nVersion, 776961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex, extra->eType, extra->nDataSize); 777061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 777161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) { 777261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data; 777361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 777461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "------ Interlace Format ------\n" 777561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Size: %lu \n" 777661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Version: %lu \n" 777761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " PortIndex: %lu \n" 777861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Is Interlace Format: %d \n" 777961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Interlace Formats: %lu \n" 778061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "=========== End of Interlace ===========\n", 778161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex, 778261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan intfmt->bInterlaceFormat, intfmt->nInterlaceFormats); 778361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) { 778461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 778561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 778661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 778761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "-------- Frame Format --------\n" 778861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Picture Type: %d \n" 778961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Interlace Type: %d \n" 779061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Pan Scan Total Frame Num: %lu \n" 779161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Concealed Macro Blocks: %lu \n" 779261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " frame rate: %lu \n" 779361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Aspect Ratio X: %lu \n" 779461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Aspect Ratio Y: %lu \n", 779561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->ePicType, 779661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->interlaceType, 779761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->panScan.numWindows, 779861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->nConcealedMacroblocks, 779961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->nFrameRate, 780061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->aspectRatio.aspectRatioX, 780161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->aspectRatio.aspectRatioY); 780261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 780361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) { 780461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 780561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "------------------------------\n" 780661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Pan Scan Frame Num: %lu \n" 780761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Rectangle x: %ld \n" 780861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Rectangle y: %ld \n" 780961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Rectangle dx: %ld \n" 781061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " Rectangle dy: %ld \n", 781161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y, 781261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy); 781361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 781461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 781561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("========= End of Frame Format =========="); 781661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra->eType == OMX_ExtraDataNone) { 781761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("========== End of Terminator ==========="); 781861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 781961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("======= End of Driver Extradata ========"); 782061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 782461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 interlaced_format_type) 7825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 782661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STREAMINTERLACEFORMAT *interlace_format; 782761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 mbaff = 0; 782861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) { 782961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 783061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 783161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE; 783261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 783361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 783461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat; 783561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT); 783661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data; 783761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT); 783861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nVersion.nVersion = OMX_SPEC_VERSION; 783961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 784061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mbaff = (h264_parser)? (h264_parser->is_mbaff()): false; 784161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((interlaced_format_type == INTERLACE_FRAME_PROGRESSIVE) && !mbaff) { 784261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->bInterlaceFormat = OMX_FALSE; 784361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 784461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 784561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 784661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->bInterlaceFormat = OMX_TRUE; 784761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; 784861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 784961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 785061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 78536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::fill_aspect_ratio_info( 785461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_aspectratioinfo *aspect_ratio_info, 785561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info) 78566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 785761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata = frame_info; 785861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width; 785961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height; 786061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX, 786161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioY); 78626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 7863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 786561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate, 78666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct msm_vidc_panscan_window_payload *panscan_payload, 78676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct vdec_aspectratioinfo *aspect_ratio_info) 7868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 786961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL; 787061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_panscan_window *panscan_window; 787161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 78726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return; 787361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 787461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE; 787561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 787661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 787761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo; 787861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO); 787961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 788061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (picture_type) { 788161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_I: 788261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeI; 788361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 788461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_P: 788561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeP; 788661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 788761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_B: 788861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeB; 788961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 789061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 789161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0; 789261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 789361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 789461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 789561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 789661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 789761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 789861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive; 789961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio)); 790061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->nConcealedMacroblocks = num_conceal_mb; 790161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->nFrameRate = frame_rate; 790261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.numWindows = 0; 790361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (panscan_payload) { 790461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.numWindows = panscan_payload->num_panscan_windows; 790561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_window = &panscan_payload->wnd[0]; 790661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) { 790761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].x = panscan_window->panscan_window_width; 790861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].y = panscan_window->panscan_window_height; 790961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset; 791061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset; 791161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_window++; 791261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 791361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 791461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fill_aspect_ratio_info(aspect_ratio_info, frame_info); 791561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 792061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL; 792161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE; 792261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 792361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 792461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef; 792561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 792661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data; 792761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *portDefn = m_port_def; 792861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u" 792961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "sliceheight = %u \n",portDefn->format.video.nFrameHeight, 793061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth, 793161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride, 793261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight); 7933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 793761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_extradata) { 793861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 793961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 794061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE); 794161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 794261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = OMX_ExtraDataNone; 794361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = 0; 794461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->data[0] = 0; 794561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 794661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index) 7950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 795161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 795261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= drv_ctx.ip_buf.actualcount) { 795361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found"); 795461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 795561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 795661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 795761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr = (desc_buffer_hdr*) \ 795861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(desc_buffer_hdr)), 795961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 796061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 796161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed "); 796261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 796361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 796461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 796561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 796661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8)); 796761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr[index].buf_addr == NULL) { 796861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed "); 796961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 797061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 797161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 797261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset) 7976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 797761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries); 797861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_demux_entries < 8192) { 797961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_offsets[m_demux_entries++] = address_offset; 798061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 798161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr) 7985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 798661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 bytes_to_parse = buf_hdr->nFilledLen; 798761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset; 798861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 index = 0; 798961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 799061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 799161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 799261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (index < bytes_to_parse) { 799361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 799461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) || 799561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 799661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buf[index+2] == 0x01)) ) { 799761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Found start code, insert address offset 799861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan insert_demux_addr_offset(index); 799961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf[index+2] == 0x01) // 3 byte start code 800061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += 3; 800161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else //4 byte start code 800261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += 4; 800361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 800461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index++; 8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 800661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries); 800761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 8008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr) 8011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 801261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //fix this, handle 3 byte start code, vc1 terminator entry 801361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *p_demux_data = NULL; 801461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 desc_data = 0; 801561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 start_addr = 0; 801661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 nal_size = 0; 801761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 suffix_byte = 0; 801861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 demux_index = 0; 801961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 buffer_index = 0; 802061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 802161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 802261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries."); 802361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 802461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 802561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 802661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 802761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_index > drv_ctx.ip_buf.actualcount) { 802861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index); 802961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 803061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 803161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 803261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr; 803361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 803461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( ((OMX_U8*)p_demux_data == NULL) || 803561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) { 803661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries."); 803761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 803861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 803961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; demux_index < m_demux_entries; demux_index++) { 804061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0; 804161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan start_addr = m_demux_offsets[demux_index]; 804261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) { 804361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3]; 804461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 804561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4]; 804661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 804761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (demux_index < (m_demux_entries - 1)) { 804861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2; 804961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 805061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2; 805161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 805261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)", 805361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan start_addr, 805461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte, 805561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size, 805661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan demux_index); 805761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = (start_addr >> 3) << 1; 805861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data |= (start_addr & 7) << 21; 805961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data |= suffix_byte << 24; 806061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 806161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 806261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32)); 806361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 806461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 806561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 806661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data += 16; 806761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 806861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_VC1) { 806961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("VC1 terminator entry"); 807061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0; 807161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0x82 << 24; 807261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 807361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 4, 0, sizeof(OMX_U32)); 807461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 807561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 807661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data += 16; 807761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries++; 807861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 807961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Add zero word to indicate end of descriptors 808061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data, 0, sizeof(OMX_U32)); 808161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 808261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32); 808361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size); 808461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 808561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 808661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 808761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Demux table complete!"); 808861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 8089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 80916eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::createDivxDrmContext() 8092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 809361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE err = OMX_ErrorNone; 809461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan iDivXDrmDecrypt = DivXDrmDecrypt::Create(); 809561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (iDivXDrmDecrypt) { 809661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE err = iDivXDrmDecrypt->Init(); 809761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (err!=OMX_ErrorNone) { 80986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_ERROR("\nERROR :iDivXDrmDecrypt->Init %d", err); 8099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete iDivXDrmDecrypt; 8100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt = NULL; 810161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 810261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 810361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM"); 810461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan err = OMX_ErrorUndefined; 810561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 810661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return err; 8107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 81086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf() 81106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 811161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 811261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = NULL; 811361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_members(); 811461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat = OMX_COLOR_FormatMax; 81156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client) 81186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 811961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = reinterpret_cast<omx_vdec*>(client); 81206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 812261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members() 812361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 812461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count = 0; 812561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = 0; 812661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = 0; 812761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_platform_list_client,0,sizeof(m_platform_list_client)); 812861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_platform_entry_client,0,sizeof(m_platform_entry_client)); 812961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_pmem_info_client,0,sizeof(m_pmem_info_client)); 813061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client)); 81316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 813261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(op_buf_ion_info,0,sizeof(m_platform_entry_client)); 81336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 813461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (int i = 0; i < MAX_COUNT; i++) 813561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[i] = -1; 81366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 813861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() 813961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 814061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 81416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::update_buffer_req() 81446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 814561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 814661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int src_size = 0, destination_size = 0; 814761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE drv_color_format; 814861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 814961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Invalid client in color convert"); 815061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 815161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 815261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 815361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("\n No color conversion required"); 815461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 815561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 815661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 815761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 && 815861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat != OMX_COLOR_FormatYUV420Planar) { 815961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion"); 816061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 816161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto fail_update_buf_req; 816261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 816361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 816461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.open(omx->drv_ctx.video_resolution.frame_height, 816561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.frame_width, 816661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NV12_128m,YCbCr420P); 816761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) { 816861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.get_buffer_size(C2D_INPUT,src_size); 816961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) 817061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.get_buffer_size(C2D_OUTPUT,destination_size); 817161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 817261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) { 817361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size || 817461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !destination_size) { 817561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d" 817661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "driver size %d destination size %d", 817761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan src_size,omx->drv_ctx.op_buf.buffer_size,destination_size); 817861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 817961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 818061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = 0; 818161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 818261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = destination_size; 818361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size) 818461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = omx->drv_ctx.op_buf.buffer_size; 818561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 818661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 818761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 81886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 81896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_update_buf_req: 819061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 819161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 81926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::set_color_format( 819561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE dest_color_format) 81966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 819761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 819861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE drv_color_format; 819961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 820061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Invalid client in color convert"); 820161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 820261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 820361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 820461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 820561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_color_format = (OMX_COLOR_FORMATTYPE) 820661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 820761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 820861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Incorrect color format"); 82096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal status = false; 82106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 821161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status && (drv_color_format != dest_color_format)) { 821261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Enabling C2D\n"); 821361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dest_color_format != OMX_COLOR_FormatYUV420Planar) { 821461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Unsupported color format for c2d"); 821561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 821661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 821761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat = OMX_COLOR_FormatYUV420Planar; 821861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled) 821961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 822061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 822161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!c2d.init()) { 822261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n open failed for c2d"); 822361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 822461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 822561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = true; 822661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 822761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 822861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled) 822961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 823061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 823161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 823261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 823361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 82346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 82366eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr() 82376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 823861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 823961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr"); 824061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 824161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 824261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 824361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->m_out_mem_ptr; 824461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return m_out_mem_ptr_client; 82456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 824761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr 824861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd) 82496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 825061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 825161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr"); 825261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 825361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 825461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 825561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bufadd; 825661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 825761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned index = 0; 825861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufadd - omx->m_out_mem_ptr; 825961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < omx->drv_ctx.op_buf.actualcount) { 826061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS); 826161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp; 826261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status; 826361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) { 826461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 826561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd, 826661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index], 826761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[index], pmem_baseaddress[index]); 826861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 826961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = buffer_size_req; 827061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!status) { 827161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Failed color conversion %d", status); 827261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = 0; 827361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return &m_out_mem_ptr_client[index]; 827461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 827561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 827661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = 0; 82776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return &m_out_mem_ptr_client[index]; 827861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 827961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr"); 828061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 82816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 828361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr 828461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd) 82856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 828661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 828761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr"); 828861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 828961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 829061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 829161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bufadd; 829261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned index = 0; 829361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufadd - m_out_mem_ptr_client; 829461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < omx->drv_ctx.op_buf.actualcount) { 829561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return &omx->m_out_mem_ptr[index]; 829661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 829761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr"); 82986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return NULL; 82996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 830061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool omx_vdec::allocate_color_convert_buf::get_buffer_req 830161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(unsigned int &buffer_size) 83026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 830361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 830461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 830561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 830661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size = omx->drv_ctx.op_buf.buffer_size; 830761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 830861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) { 830961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Get buffer size failed"); 831061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 831161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto fail_get_buffer_size; 831261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 831361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 831461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_size < omx->drv_ctx.op_buf.buffer_size) 83156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buffer_size = omx->drv_ctx.op_buf.buffer_size; 831661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 831761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 83186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_get_buffer_size: 831961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 832061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 83216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 83226eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer( 832361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufhdr) 832461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 832561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 832661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 832761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 832861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->free_output_buffer(bufhdr); 832961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled && omx->is_component_secure()) 833061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 833161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!allocated_count || !bufhdr) { 833261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr); 833361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 833461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 833561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufhdr - m_out_mem_ptr_client; 833661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= omx->drv_ctx.op_buf.actualcount) { 833761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer"); 833861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 833961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 834061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd[index] > 0) { 834161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap(pmem_baseaddress[index], buffer_size_req); 834261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd[index]); 834361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 834461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[index] = -1; 83456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 834661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->free_ion_memory(&op_buf_ion_info[index]); 8347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 834861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr[index].video_heap_ptr = NULL; 834961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocated_count > 0) 835061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count--; 835161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 835261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count = 0; 835361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!allocated_count) { 835461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 835561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 835661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_members(); 835761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 835861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 835961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->free_output_buffer(&omx->m_out_mem_ptr[index]); 83606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 8361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 83626eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 836361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes) 83646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 836561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 836661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 836761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 836861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 836961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 837061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled && omx->is_component_secure()) { 837161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d", 837261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->is_component_secure()); 837361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUnsupportedSetting; 837461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 837561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!bufferHdr || bytes > buffer_size_req) { 837661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr); 837761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %lu", 837861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req,bytes); 837961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 838061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 838161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocated_count >= omx->drv_ctx.op_buf.actualcount) { 838261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert"); 838361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 838461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 838561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL; 838661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr, 838761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan port,appData,omx->drv_ctx.op_buf.buffer_size); 838861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone || !temp_bufferHdr) { 838961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert"); 839061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 839161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 839261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((temp_bufferHdr - omx->m_out_mem_ptr) >= 839361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.op_buf.actualcount) { 839461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n Invalid header index %d", 839561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (temp_bufferHdr - omx->m_out_mem_ptr)); 839661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUndefined; 839761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 839861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int i = allocated_count; 83996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 840061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory( 840161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req,buffer_alignment_req, 840261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data, 840361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 0); 840461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd; 840561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (op_buf_ion_info[i].ion_device_fd < 0) { 840661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert"); 840761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 840861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 840961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req, 841061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0); 841161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 841261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_baseaddress[i] == MAP_FAILED) { 841361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req); 841461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd[i]); 841561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->free_ion_memory(&op_buf_ion_info[i]); 841661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 841761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 841861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr[i].video_heap_ptr = new VideoHeap ( 841961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_buf_ion_info[i].ion_device_fd,buffer_size_req, 842061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]); 84216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 842261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get(); 842361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info_client[i].offset = 0; 842461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i]; 842561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 842661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list_client[i].nEntries = 1; 842761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list_client[i].entryList = &m_platform_entry_client[i]; 842861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pOutputPortPrivate = NULL; 842961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nAllocLen = buffer_size_req; 843061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nFilledLen = 0; 843161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nFlags = 0; 843261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 843361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE); 843461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION; 843561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i]; 843661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i]; 843761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pAppPrivate = appData; 843861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = &m_out_mem_ptr_client[i]; 843961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr); 844061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count++; 844161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 84426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 84436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 84446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::is_component_secure() 84456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 844661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return secure_mode; 84476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 84486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 84496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format) 84506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 845161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 845261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 845361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 845461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dest_color_format = (OMX_COLOR_FORMATTYPE) 845561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 845661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 845761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 845861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 845961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ColorFormat != OMX_COLOR_FormatYUV420Planar) { 846061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 846161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 846261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dest_color_format = OMX_COLOR_FormatYUV420Planar; 846361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 846461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 84656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 8466