1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*-------------------------------------------------------------------------- 2e4010605f233a213cf0d972397bb33c34c364227Patrick TjinCopyright (c) 2013-2015, 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 USE_EGL_IMAGE_GPU 69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h> 70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h> 71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00 72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01 73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0" 77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30 78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1; 79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0"; 80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1; 83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv"; 84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile; 87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata"; 88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef VENUS_HEVC 918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEVICE_NAME "/dev/video/venus_dec" 928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else 938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEVICE_NAME "/dev/video/q6_dec" 948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif 958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30 97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR DEFAULT_FPS 98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120 99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE 0xC5000000 101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK 0xFF000000 102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE 0x0F010000 103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK 0xF0 104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK 0xE0000000 105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE 0 106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE 1 107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE 3 108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL 0 109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL 2 110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN 4 111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS 8 112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS 12 113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS 24 114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE 36 1156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define POLL_TIMEOUT 0x7fffffff 116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion" 118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_HEAP_ID ION_CP_MM_HEAP_ID 119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 12161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" { 12261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include<utils/Log.h> 12361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_ 125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_4K 0x1000 1276eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_1M 0x100000 1286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } } 130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); } 131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0) 132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA) 1348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input) 136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer; 13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct pollfd pfd; 14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer v4l2_buf; 14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event dqevent; 14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec *omx = reinterpret_cast<omx_vdec*>(input); 14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pfd.fd = omx->drv_ctx.video_driver_fd; 14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0; 1478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: Async thread start"); 14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0); 14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = poll(&pfd, 1, POLL_TIMEOUT); 15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!rc) { 1528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Poll timedout"); 15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (rc < 0) { 1558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error while polling: %d", rc); 15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) { 15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.memory = V4L2_MEMORY_USERPTR; 16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.length = omx->drv_ctx.num_planes; 16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.m.planes = plane; 16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) { 16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.len=plane[0].bytesused; 16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr; 17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) + 17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (uint64_t)v4l2_buf.timestamp.tv_usec; 17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (vdec_msg.msgdata.output_frame.len) { 17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2]; 17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3]; 17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4]; 17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5]; 17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 1798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) { 18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.memory = V4L2_MEMORY_USERPTR; 18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.length = 1; 18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.m.planes = plane; 19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) { 19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE; 19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 1958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pfd.revents & POLLPRI) { 20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent); 20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) { 20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED; 20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved"); 20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT ) { 21261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_INFO_CONFIG_CHANGED; 21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved"); 21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) { 22161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE; 22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Flush Done Recieved"); 22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 22861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE; 23061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Flush Done Recieved"); 23261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 23561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) { 2378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Close Done Recieved and async_message_thread Exited"); 23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 23961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) { 24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 24161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR; 24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("SYS Error Recieved"); 24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 24761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 2498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Some Event recieved"); 25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan continue; 25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: Async thread stop"); 25561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input) 259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 26061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec* omx = reinterpret_cast<omx_vdec*>(input); 26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char id; 26261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int n; 26361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx == NULL) { 2648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("message thread null pointer rxd"); 26561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: message thread start"); 26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0); 27061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 27261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan n = read(omx->m_pipe_in, &id, 1); 273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 27461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == n) { 27561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (1 == n) { 27961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->process_event_cb(omx, id); 28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 28161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((n < 0) && (errno != EINTR)) { 2828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno); 28361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: message thread stop"); 28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id) 291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 29261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret_value; 2936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 29461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx == NULL) { 2958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("message thread null pointer rxd"); 29661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 29761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out); 29961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret_value = write(omx->m_pipe_out, &id, 1); 3008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value); 301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor 304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue() 305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 30661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Nothing to do 307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor 310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memset(m_q,0,sizeof(m_q)); 313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert 316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id) 317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 31861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 31961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) { 32061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].id = id; 32161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].param1 = p1; 32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].param2 = p2; 32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_write++; 32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_size ++; 32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) { 32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_write = 0; 32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 3308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__); 33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop 336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id) 337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 33961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_size > 0) { 34061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *id = m_q[m_read].id; 34161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *p1 = m_q[m_read].param1; 34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *p2 = m_q[m_read].param2; 34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the read pointer ahead 34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ++m_read; 34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan --m_size; 34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) { 34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_read = 0; 34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 35061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 35161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 35261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue 356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type() 357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return m_q[m_read].id; 359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list() 363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 36461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //initialize timestamps array 36561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) ); 366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list() 368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //free m_ts_arr_list? 370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts) 373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool duplicate_ts = false; 37661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 37761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //insert at the first available empty location 37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_ts_arr_list[idx].valid) { 38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //found invalid or empty entry, save timestamp 38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].valid = true; 38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].timestamp = ts; 38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts, idx); 38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) { 39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 39261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 39961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 40061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int min_idx = -1; 40161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_TICKS min_ts = 0; 40261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_ts_arr_list[idx].valid) { 40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //found valid entry, save index 40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (min_idx < 0) { 40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //first valid entry 41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_ts = m_ts_arr_list[idx].timestamp; 41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_idx = idx; 41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_ts_arr_list[idx].timestamp < min_ts) { 41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_ts = m_ts_arr_list[idx].timestamp; 41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_idx = idx; 41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (min_idx < 0) { 42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //no valid entries found 42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts = 0; 42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts = m_ts_arr_list[min_idx].timestamp; 42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[min_idx].valid = false; 42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts, min_idx); 43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list() 438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 43961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 44061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 44161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 44361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 44461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].valid = false; 44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances 451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void) 452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 45361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return (new omx_vdec); 454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base, 459f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ion_user_handle_t handle, int ionMapfd) 460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 46161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd); 462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base) 465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // dup file descriptor, map once, use pmem 467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev init(dup(fd), base, size, 0 , MEM_DEVICE); 468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_ 471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::omx_vdec 474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 47561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Constructor 477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None 480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::omx_vdec(): m_error_propogated(false), 48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state(OMX_StateInvalid), 48661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_app_data(NULL), 48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr(NULL), 48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr(NULL), 48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_err_count(0), 49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress (false), 49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress (false), 49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_use_buffer (false), 49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_use_buffer (false), 49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers(false), 49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem(OMX_FALSE), 49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_region_smi(OMX_FALSE), 49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_pvt_entry_pmem(OMX_FALSE), 49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers(0), 49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers(0), 50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count(0), 50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bm_count(0), 50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated(OMX_FALSE), 50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bPopulated(OMX_FALSE), 50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_flags(0), 505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr(NULL), 507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled(OMX_TRUE), 50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled(OMX_TRUE), 51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_in_alloc_cnt(0), 51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list(NULL), 51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry(NULL), 51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info(NULL), 51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes (true), 51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame (NULL), 51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame (NULL), 51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr (NULL), 51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr(NULL), 51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_inp_bm_count (0), 52061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse ((codec_type)0), 52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame_meta (true), 52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count (0), 52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count (0), 52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length(0), 52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal (false), 52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame(0), 52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_buffer(NULL), 52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame_size (0), 52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_device_file_ptr(NULL), 53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile((vc1_profile_type)0), 53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts(LLONG_MAX), 53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags(0), 53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts(LLONG_MAX), 53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts(true), 53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int(0), 53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan in_reconfig(false), 53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_display_id(NULL), 53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser(NULL), 53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata(0), 540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_enable_android_native_buffers(OMX_FALSE), 54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_android_native_buffers(OMX_FALSE), 543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 54461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr(NULL), 54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan secure_mode(false) 546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Assumption is that , to begin with , we have all the frames with decoder */ 54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("In OMX vdec Constructor"); 549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 55061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char property_value[PROPERTY_VALUE_MAX] = {0}; 5518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_get("vidc.debug.level", property_value, "1"); 5528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan debug_level = atoi(property_value); 5538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_value[0] = '\0'; 5548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.perf", property_value, "0"); 55661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan perf_flag = atoi(property_value); 55761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 55861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag); 55961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms = latency = 0; 56161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 56361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.ts", property_value, "0"); 56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_timestamp = atoi(property_value); 56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp); 56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(true); 56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.enable_debug_print(true); 56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.concealedmb", property_value, "0"); 57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_concealedmb = atoi(property_value); 57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb); 575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_cmp,0,sizeof(m_cmp)); 57861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_cb,0,sizeof(m_cb)); 57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (&drv_ctx,0,sizeof(drv_ctx)); 58061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE)); 58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (m_hwdevice_name,0,sizeof(m_hwdevice_name)); 58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, sizeof(m_demux_offsets) ); 58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 5846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_ 58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 5866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.timestamp_adjust = false; 58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = -1; 59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = NULL; 59161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init(&m_lock, NULL); 59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init(&c_lock, NULL); 59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_init(&m_cmd_lock,0,0); 59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = 59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[OUTPUT_PORT] = false; 596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char extradata_value[PROPERTY_VALUE_MAX] = {0}; 59861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.extradata", extradata_value, "0"); 59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_extradata = atoi(extradata_value); 60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata); 601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB; 60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_buffers.set_vdec_client(this); 6046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 6056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 6066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = { 60761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_FLUSH_DONE, 60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT, 60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT, 61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_CLOSE_DONE, 61161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_SYS_ERROR 6126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}; 6136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 6146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd) 6156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event_subscription sub; 61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int array_sz = sizeof(event_type)/sizeof(int); 61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i,rc; 62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 6218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid input: %d", fd); 62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < array_sz; ++i) { 62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 6308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type); 63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < array_sz) { 63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (--i; i >=0 ; i--) { 63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 63761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) 6408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNotImplemented; 64361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd) 6496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 65061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 65161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event_subscription sub; 65261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int array_sz = sizeof(event_type)/sizeof(int); 65361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i,rc; 65461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 6558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid input: %d", fd); 65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < array_sz; ++i) { 66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 6648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 66561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 66861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 6696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 6706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::~omx_vdec 674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 67661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Destructor 677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 67861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 67961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None 680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec() 685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = NULL; 68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_decoder_cmd dec; 68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("In OMX vdec Destructor"); 68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_pipe_in) close(m_pipe_in); 69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_pipe_out) close(m_pipe_out); 69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_in = -1; 69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_out = -1; 69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_join(msg_thread_id,NULL); 69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.cmd = V4L2_DEC_CMD_STOP; 69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 6988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("STOP Command failed"); 69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_join(async_thread_id,NULL); 70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsubscribe_to_events(drv_ctx.video_driver_fd); 70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&m_lock); 70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&c_lock); 70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_destroy(&m_cmd_lock); 70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME"); 70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.end(); 70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Exit OMX vdec Destructor"); 711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type) 71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 71861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 71961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = 0; 72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 7246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 7256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::OMXCntrlProcessMsgCb 729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 73161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL Client callbacks are generated through this routine. The decoder 73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan provides the thread context for this routine. 733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 73461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ctxt -- Context information related to the self. 73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id -- Event identifier. This could be any of the following: 73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1. Command completion event 73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2. Buffer done callback event 73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3. Frame done callback event 740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id) 746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan signed int p1; // Parameter - 1 74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan signed int p2; // Parameter - 2 74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int ident; 75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int qsize=0; // qsize 75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec *pThis = (omx_vdec *) ctxt; 75261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis) { 7548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out", 75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan __func__); 75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Protect the shared queue data structure 76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan do { 76161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Read the message id's from the queue*/ 76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&pThis->m_lock); 76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_cmd_q.m_size; 76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize == 0 && pThis->m_state != OMX_StatePause) { 76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_ftb_q.m_size; 77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize == 0 && pThis->m_state != OMX_StatePause) { 77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_etb_q.m_size; 77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&pThis->m_lock); 78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*process message if we have one*/ 78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize > 0) { 78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id = ident; 78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (id) { 78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT: 78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (p1) { 79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandStateSet: 79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = (OMX_STATETYPE) p2; 7928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d", 79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state); 79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL); 79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 79761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_EventError: 79961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_StateInvalid) { 8008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid"); 80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = (OMX_STATETYPE) p2; 80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (p2 == OMX_ErrorHardware) { 80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error(); 80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 80761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventError, p2, (OMX_U32)NULL, NULL ); 80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandPortDisable: 8138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%d]", p2); 81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 81861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) { 82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT)) 8238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to release output buffers"); 82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf); 82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->in_reconfig = false; 82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error(); 82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandPortEnable: 8368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%d]", p2); 83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 8488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_ETB_ARBITRARY: 85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 8548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure"); 85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_ETB: 85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 8618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure"); 86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FTB: 86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 8698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure"); 87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_COMMAND: 87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U32)p2,(OMX_PTR)NULL); 87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EBD: 88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) { 8828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure"); 88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) { 88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_inp_err_count++; 88761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->time_stamp_dts.remove_time_stamp( 88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp, 88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_inp_err_count = 0; 89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( pThis->empty_buffer_done(&pThis->m_cmp, 89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 8968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_buffer_done failure"); 89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) { 9008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR); 90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: 90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int64_t *timestamp = (int64_t *)p1; 90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p1) { 90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->time_stamp_dts.remove_time_stamp(*timestamp, 91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(timestamp); 91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FBD: 91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 9188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure"); 91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( pThis->fill_buffer_done(&pThis->m_cmp, 92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 9228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("fill_buffer_done failure"); 92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 92761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 9288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Driver flush i/p Port complete"); 92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->input_flush_progress) { 9308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->execute_input_flush(); 93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 9358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we need generate event for Flush done*/ 93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_INPUT_FLUSH_PENDING)) { 94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 9428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Input Flush completed - Notify Client"); 94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandFlush, 94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX,NULL ); 94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_IDLE_PENDING)) { 94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) { 9508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port"); 95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->streaming[OUTPUT_PORT] = false; 95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->output_flush_progress) { 9568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Input flush done hence issue stop"); 95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 9698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Driver flush o/p Port complete"); 97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->output_flush_progress) { 9718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->execute_output_flush(); 97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 9768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we need generate event for Flush done*/ 98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) { 9828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Notify Output Flush done"); 98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandFlush, 98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 9908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Internal flush complete"); 99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) { 99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event(OMX_CommandPortDisable, 99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) { 100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 10068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port"); 100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->streaming[CAPTURE_PORT] = false; 101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->input_flush_progress) { 10128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Output flush done hence issue stop"); 101361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 101961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_START_DONE: 10258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE"); 102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 10298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure"); 103061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 10328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success"); 103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 10348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Move to executing"); 103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateExecuting; 103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 103961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateExecuting, NULL); 104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (BITMASK_PRESENT(&pThis->m_flags, 104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_PAUSE_PENDING)) { 104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (/*ioctl (pThis->drv_ctx.video_driver_fd, 104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) { 10458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed"); 104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 10518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Event Handler callback is NULL"); 105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_PAUSE_DONE: 10568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 105861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->complete_pending_buffer_done_cbs(); 106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) { 10648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Send the callback now 106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StatePause; 106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StatePause, NULL); 107161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_RESUME_DONE: 10808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 10838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 10878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Moving the decoder to execute state"); 108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateExecuting; 109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateExecuting,NULL); 109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_STOP_DONE: 11038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 11068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->complete_pending_buffer_done_cbs(); 111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) { 11118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success"); 111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateIdle; 11158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Move to Idle State"); 111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateIdle,NULL); 111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 11288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG"); 112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_IndexParamPortDefinition) { 113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->in_reconfig = true; 113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventPortSettingsChanged, p1, p2, NULL ); 113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) { 114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1; 114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged; 114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan format = OMX_InterlaceInterleaveFrameTopFieldFirst; 114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan format = OMX_InterlaceInterleaveFrameBottomFieldFirst; 114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else //unsupported interlace format; raise a error 114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan event = OMX_EventError; 114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan event, format, 0, NULL ); 115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EOS_DONE: 11598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 116461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->prev_ts = LLONG_MAX; 116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->rst_prev_ts = true; 116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 11718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG: 117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 11768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG"); 117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 117861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL ); 118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 118161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 118361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&pThis->m_lock); 118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_cmd_q.m_size; 119061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_state != OMX_StatePause) 119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 119261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&pThis->m_lock); 119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } while (qsize>0); 1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::update_resolution(int width, int height) 11986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 11996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.frame_height = height; 12006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.frame_width = width; 12016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.scan_lines = height; 12026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.stride = width; 12036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nLeft = 0; 12046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nTop = 0; 12056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nWidth = drv_ctx.video_resolution.frame_width; 12066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rectangle.nHeight = drv_ctx.video_resolution.frame_height; 12076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 1208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 121061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 121161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentInit 1212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 121361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 121461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Initialize the component. 1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 121661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ctxt -- Context information related to the self. 121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id -- Event identifier. This could be any of the following: 121961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1. Command completion event 122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2. Buffer done callback event 122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3. Frame done callback event 1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) 1228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_fmtdesc fdesc; 123261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 123361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 123461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 123561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int alignment = 0,buffer_size = 0; 123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fds[2]; 123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int r,ret=0; 123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool codec_ambiguous = false; 12398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_STRING device_name = (OMX_STRING)DEVICE_NAME; 12408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Opening device %s", device_name); 124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = open(device_name, O_RDWR); 124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 12438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec::component_init(): Open device %s returned fd %d, errno %d", 124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan device_name, drv_ctx.video_driver_fd, errno); 124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_driver_fd == 0) { 124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = open(device_name, O_RDWR); 124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 125061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_driver_fd < 0) { 12518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno); 125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 12576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal ret = pthread_create(&async_thread_id,0,async_message_thread,this); 125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret < 0) { 125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 12608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to create async_message_thread"); 126161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 126561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcpy(inputfilename, INPUT_BUFFER_FILE_NAME); 1266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputBufferFile1 = fopen (outputfilename, "ab"); 1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputExtradataFile = fopen (ouputextradatafilename, "ab"); 1272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 127461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Copy the role information which provides the decoder kind 127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy(drv_ctx.kind,role,128); 127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 127761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\ 127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mpeg4",\ 128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.timestamp_adjust = true; 128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4; 128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingMPEG4; 128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_MPEG4; 128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Start Code for MPEG4*/ 128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_MPEG4; 128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "m4v"); 1290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\ 129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mpeg2",\ 129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2; 129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_MPEG2; 129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingMPEG2; 129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Start Code for MPEG2*/ 129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_MPEG2; 130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "mpg"); 1303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\ 130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 13078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("H263 Decoder selected"); 130861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_H263; 130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingH263; 131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_H263; 131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_H263; 131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 131461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "263"); 1315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\ 131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 13198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW ("DIVX 311 Decoder selected"); 132061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3; 132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX_311; 132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 132661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ 132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 13298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected"); 133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4; 133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX; 133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_ambiguous = true; 133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\ 133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 13408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected"); 134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6; 134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX; 134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_ambiguous = true; 134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\ 134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_H264; 135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_H264; 135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingAVC; 135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_H264; 135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 1357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "264"); 1359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\ 136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC; 136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_HEVC; 136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc; 136661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_HEVC; 136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 13696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef INPUT_BUFFER_LOG 137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "265"); 13716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\ 137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_VC1; 137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingWMV; 137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VC1; 137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_VC1_ANNEX_G; 137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "vc1"); 1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\ 138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV; 138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingWMV; 138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VC1; 138961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_VC1_ANNEX_L; 139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_start_codes (codec_type_parse); 1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strcat(inputfilename, "vc1"); 1393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",\ 139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_VP8; 13985aa03230fef7a43a61e1ac5f19a2c5a71e5d6df7Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingVP8; 139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VP8; 140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 14028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Unknown Component"); 140361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan inputBufferFile1 = fopen (inputfilename, "ab"); 1407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 1409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.output_format = VDEC_YUV_FORMAT_NV12; 14116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE) 14126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 14136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (!client_buffers.set_color_format(dest_color_format)) { 14148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setting color format failed"); 14156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet = OMX_ErrorInsufficientResources; 14166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 1417dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan capture_capability= V4L2_PIX_FMT_NV12; 141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = subscribe_to_events(drv_ctx.video_driver_fd); 142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 14218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Subscribe Event Failed"); 142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_capability cap; 142661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap); 142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 14288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to query capabilities"); 142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s," 14328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " version = %d, capabilities = %x", cap.driver, cap.card, 143361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan cap.bus_info, cap.version, cap.capabilities); 143461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=0; 143661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 143761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index=0; 143861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 14398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.pixelformat, fdesc.flags); 144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index++; 144261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index=0; 144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 14478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.pixelformat, fdesc.flags); 144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index++; 145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal update_resolution(320, 240); 145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 145561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 14598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set format on output port"); 146061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set Format was successful"); 146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_ambiguous) { 146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (output_capability == V4L2_PIX_FMT_DIVX) { 146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control divx_ctrl; 146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) { 146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4; 146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) { 146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5; 147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6; 147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 147461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT; 147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl); 147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 14778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set divx version"); 147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 148061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Codec should not be ambiguous"); 148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 148261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 14918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set format on capture port"); 149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set Format was successful"); 149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE; 149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = 1; 14978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret); 149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 15008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret); 150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Get the Buffer requirements for input and output ports*/ 150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT; 150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment=SZ_1M; 151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment=SZ_1M; 151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment=SZ_4K; 151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment=SZ_4K; 151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata = 0; 151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.picture_order = VDEC_ORDER_DISPLAY; 151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.idr_only_decoding = 0; 1523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 15246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_state = OMX_StateLoaded; 1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA 15266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (eRet == OMX_ErrorNone && !secure_mode) 15276eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal enable_extradata(DEFAULT_EXTRADATA, true, true); 1528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 15296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet=get_buffer_req(&drv_ctx.ip_buf); 15308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Input Buffer Size =%d",drv_ctx.ip_buf.buffer_size); 15316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal get_buffer_req(&drv_ctx.op_buf); 153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 || 153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC) { 153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size; 153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size); 153661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nOffset = 0; 153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 15408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed "); 154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 154661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils == NULL) { 154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils = new H264_Utils(); 154861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 154961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils == NULL) { 15508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("parser utils Allocation failed "); 155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 155261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 155461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size); 155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser = new h264_stream_parser(); 155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!h264_parser) { 156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!"); 156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pipe(fds)) { 15668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("pipe creation failed"); 156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int temp1[2]; 157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fds[0] == 0 || fds[1] == 0) { 157161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pipe (temp1)) { 15728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("pipe creation failed"); 157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 15746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //close (fds[0]); 157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //close (fds[1]); 157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fds[0] = temp1 [0]; 157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fds[1] = temp1 [1]; 157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_in = fds[0]; 158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_out = fds[1]; 158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan r = pthread_create(&msg_thread_id,0,message_thread,this); 158361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (r < 0) { 15858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("component_init(): message_thread creation failed"); 158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 158761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 158961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 15906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 15928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Component Init Failed"); 15938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Calling VDEC_IOCTL_STOP_NEXT_MSG"); 159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 159561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL); 15968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Calling close() on Video Driver"); 159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.video_driver_fd); 159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = -1; 159961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 16008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec::component_init() success"); 160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer)); 160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 1604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetComponentVersion 1609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 161161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns the component version. 1612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 161361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 161461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan TBD. 1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 161661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 161761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorNone. 1618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_component_version 162161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan( 162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 162361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STRING componentName, 162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* componentVersion, 162561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* specVersion, 162661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_UUIDTYPE* componentUUID 162761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 162961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 16308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Comp Version in Invalid State"); 1631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 1632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* TBD -- Return the proper version */ 163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (specVersion) { 163561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan specVersion->nVersion = OMX_SPEC_VERSION; 163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 163761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 1638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 164061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 164161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommand 1642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 1645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 164761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 164961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 1651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 165261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp, 165461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_COMMANDTYPE cmd, 165561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 param1, 165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR cmdData 165761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 16598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command: Recieved a Command from Client"); 166061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 16618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State"); 1662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 1663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 166561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) { 16668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush " 166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "to invalid port: %lu", param1); 166861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 1669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_wait(&m_cmd_lock); 16728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command: Command Processed"); 1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommand 1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 168061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 168161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 1682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 168461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 1688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 169161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_COMMANDTYPE cmd, 169261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 param1, 169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR cmdData 169461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 1695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 169761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STATETYPE eState = (OMX_STATETYPE) param1; 169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bFlag = 1,sem_posted = 0,ret=0; 169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd); 17018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d", 170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state, eState); 170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 170461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (cmd == OMX_CommandStateSet) { 17058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued"); 17068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState); 170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Loaded */ 170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateLoaded) { 171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateIdle) { 171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //if all buffers are allocated or all ports disabled 171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done() || 171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) { 17158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle"); 171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 17178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending"); 171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Loaded */ 172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 17258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded"); 172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 172861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 172961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 173061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to WaitForResources */ 173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 17348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources"); 173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Executing */ 173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 17388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing"); 173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Pause */ 174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 17458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause"); 174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 174761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 174861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Invalid */ 175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 17528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid"); 175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 175461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 17568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\ 175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eState); 175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 175961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 176161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is IDLE */ 176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateIdle) { 176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateLoaded) { 176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_done()) { 176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* 176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Since error is None , we will post an event at the end 177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan of this function definition 177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 17728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded"); 177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 17748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending"); 177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Executing */ 178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 17828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 178361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 178461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 17858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state=OMX_StateExecuting; 17878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful"); 178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 178961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Idle */ 179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateIdle) { 17918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle"); 179261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 179561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to WaitForResources */ 179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 17988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources"); 179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 180361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Pause */ 180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 180561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*To pause the Video core we need to start the driver*/ 180661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START, 180761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL) < */0) { 18088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED"); 180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 181061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorHardware; 181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 18138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause"); 181461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 181761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Invalid */ 181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 18198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid"); 182061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 182161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 182261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 18238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState); 182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 182561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1826dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand } 1827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 182861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /******************************/ 182961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Executing */ 183061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /******************************/ 183161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateExecuting) { 18328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting"); 183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Idle */ 183461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateIdle) { 183561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 183661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition 183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 18388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle"); 183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 184061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 184261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 184361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_ALL); 184461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 184561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 184661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 184761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Paused */ 184861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 18498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PAUSE Command Issued"); 185061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StatePause; 185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 185361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Loaded */ 185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 18558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded"); 185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 185861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 185961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to WaitForResources */ 186161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 18628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources"); 186361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 186461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Executing */ 186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 18698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing"); 187061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 187161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 187261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Invalid */ 187561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 18768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid"); 187761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 187861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 18808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState); 188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 188361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 188561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Pause */ 188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StatePause) { 188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Executing */ 188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateExecuting) { 18908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pause --> Executing"); 189161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StateExecuting; 189261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 189361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 189461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Idle */ 189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateIdle) { 189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 189761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 18988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pause --> Idle"); 189961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 190161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 190361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_ALL); 190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to loaded */ 190861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 19098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> loaded"); 191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 191161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 191361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 191461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to WaitForResources */ 191561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 19168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> WaitForResources"); 191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 191961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 192161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Pause */ 192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 19238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> Pause"); 192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Invalid */ 192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 19308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> Invalid"); 193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 193261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 193361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 19348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState); 193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 193761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 193961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is WaitForResources */ 194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateWaitForResources) { 194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Loaded */ 194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateLoaded) { 194461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 19468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded"); 194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to WaitForResources */ 194961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 19508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources"); 195161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState, 195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 195361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 195561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Executing */ 195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 19578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing"); 195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Pause */ 196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 19648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause"); 196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 196761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 196861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 196961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Invalid */ 197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 19718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid"); 197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 197361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Loaded - 197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan is NOT tested by Khronos TS */ 197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 197861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 19798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState); 198061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /********************************/ 198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Invalid */ 198561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*******************************/ 198661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateInvalid) { 198761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* State Transition from Inavlid to any state */ 198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == (OMX_StateLoaded || OMX_StateWaitForResources 198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || OMX_StateIdle || OMX_StateExecuting 199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || OMX_StatePause || OMX_StateInvalid)) { 19918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded"); 199261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorInvalidState,\ 199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 1995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (cmd == OMX_CommandFlush) { 19978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued" 199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 200261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 200361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 200461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 200561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 20078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Semaphore"); 200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(param1); 201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( cmd == OMX_CommandPortEnable) { 20138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued" 201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled = OMX_TRUE; 201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 201861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (m_state == OMX_StateLoaded && 201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 202061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || allocate_input_done()) { 202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 202261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 202361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 20248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 203061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 20318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Enable output Port command recieved"); 203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled = OMX_TRUE; 203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 203461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (m_state == OMX_StateLoaded && 203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 203661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (allocate_output_done())) { 203761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 2038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 20418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 204561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 204761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (cmd == OMX_CommandPortDisable) { 20488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued" 204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "with param1: %lu", param1); 205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled = OMX_FALSE; 205261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_input_done()) { 205461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 2055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 205961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 206061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 206161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 206261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 206461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled = OMX_FALSE; 20728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Disable output Port command recieved"); 207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_output_done()) { 207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 2076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 207861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 208461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 208561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 208661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 20938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd); 209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNotImplemented; 209561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone && bFlag) { 209761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 209961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post(&m_cmd_lock); 210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ExecuteOmxFlush 2109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Executes the OMX flush. 2112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 211461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan flushtype - input flush(1)/output flush(0)/ both. 2115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 211661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 2118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType) 2121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer v4l2_buf; 212561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_decoder_cmd dec; 212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("in %s", __func__); 212761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH; 212961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (flushType) { 213061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CORE_INPUT_PORT_INDEX: 213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = true; 213261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT; 213361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CORE_OUTPUT_PORT_INDEX: 213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = true; 213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = true; 214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = true; 214161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | 214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 21468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Flush Port (%lu) Failed ", flushType); 214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = false; 214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 2153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush 2154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 215661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at OUTPUT PORT. 2157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 215961a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone. 2160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false 2163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 2164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush() 2165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 216661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1 = 0; // Parameter - 1 216761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2 = 0; // Parameter - 2 216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident = 0; 216961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = true; 217061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Generate FBD for all Buffers in the FTBq*/ 217261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 21738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initiate Output Flush"); 217461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_ftb_q.m_size) { 21758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer queue size %d pending buf cnt %d", 217661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.m_size,pending_output_buffers); 217761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.pop_entry(&p1,&p2,&ident); 21788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ID(%x) P1(%x) P2(%x)", ident, p1, p2); 217961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == m_fill_output_msg ) { 218061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 218161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_FBD) { 218261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 218461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 218661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = false; 218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 21928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers); 219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 2196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush 2197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 219961a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at INPUT PORT. 2200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 220261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone. 2203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false 2206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 2207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush() 2208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 220961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i =0; 221061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1 = 0; // Parameter - 1 221161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2 = 0; // Parameter - 2 221261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident = 0; 221361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = true; 221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 221561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Generate EBD for all Buffers in the ETBq*/ 22168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initiate Input Flush"); 221761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 221861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 22198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Check if the Queue is empty"); 222061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_etb_q.m_size) { 222161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 222261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 222361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 22248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 222561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 222661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_ETB) { 222761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers++; 22288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 222961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 22328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p", 223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1); 223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 223761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.flush_timestamp(); 223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Heap Buffers are to be flushed*/ 22398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (arbitrary_bytes && !(codec_config_flag)) { 22408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Reset all the variables before flusing"); 224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count = 0; 224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count = 0; 224561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = 0; 224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 22498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initialize parser"); 225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) { 225161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_input_pending_q.m_size) { 225561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&p1,&p2,&ident); 225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1); 225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame) { 226061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame); 226161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 226361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL, 226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned int)NULL); 226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 227061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.flush(); 22718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (codec_config_flag) { 22728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer " 22738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "is not sent to the driver yet"); 227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = false; 227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.reset_ts_list(); 228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 22868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers); 228761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommandEvent 2294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 229561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 229661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Send the event to decoder pipe. This is needed to generate the callbacks 229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan in decoder thread context. 2298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 230061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 2301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1, 230761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int p2, 230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int id) 2309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 231061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 231161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 231261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 231361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 231461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 231561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (id == m_fill_output_msg || 231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_FBD) { 231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.insert_entry(p1,p2,id); 231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (id == OMX_COMPONENT_GENERATE_ETB || 231961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_EBD || 232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 232161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.insert_entry(p1,p2,id); 232261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cmd_q.insert_entry(p1,p2,id); 232461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 23278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this); 232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_message(this, id); 232961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 2333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 2336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNoMore; 233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!profileLevelType) 233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nPortIndex == 0) { 234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 2) { 235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 23548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d", 235561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->nProfileIndex); 235661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 235761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 235861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 235961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // TODO 236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 23618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d", 236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->nProfileIndex); 236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) { 236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_H263Level70; 236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 23708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex); 237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 23818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex); 238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 238461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple; 238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 239161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain; 239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 239361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 23948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex); 239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 23998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu", profileLevelType->nPortIndex); 240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetParameter 2408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 240961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 241061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Get Parameter method implementation 2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 241561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Error None if successful. 2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 242061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE paramIndex, 242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_PTR paramData) 2422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 24258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter:"); 242661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 24278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Param in Invalid State"); 2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (paramData == NULL) { 24318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get Param in Invalid paramData"); 2432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 243461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)paramIndex) { 243561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPortDefinition: 243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 243761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 243861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 24398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition"); 244061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = update_portdef(portDefn); 244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_port_def = *portDefn; 244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 244561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoInit: 244661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 244761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *portParamType = 244861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 24498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit"); 245061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 245161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 245261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nSize = sizeof(portParamType); 245361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nPorts = 2; 245461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nStartPortNumber = 0; 245561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 245661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoPortFormat: 245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 246061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 24618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat"); 246261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 246461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nSize = sizeof(portFmt); 246561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 246661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nPortIndex) { 246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nIndex) { 246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = OMX_COLOR_FormatUnused; 246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eCompressionFormat = eCompressionFormat; 247061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 24728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore compression formats"); 247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (1 == portFmt->nPortIndex) { 247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nIndex) 247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE) 248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (1 == portFmt->nIndex) 248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar; 248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 24858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore Color formats"); 248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("returning %d", portFmt->eColorFormat); 248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 24908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: Bad port index %d", 249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portFmt->nPortIndex); 249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 249361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 249561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamAudioInit: 249861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 249961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *audioPortParamType = 250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 25018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit"); 250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nSize = sizeof(audioPortParamType); 250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nPorts = 0; 250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nStartPortNumber = 0; 250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamImageInit: 251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 251161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *imagePortParamType = 251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 25138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit"); 251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nSize = sizeof(imagePortParamType); 251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nPorts = 0; 251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nStartPortNumber = 0; 251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 2519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 252261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamOtherInit: 252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 25248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x", 252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedIndex; 252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamStandardComponentRole: 253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_COMPONENTROLETYPE *comp_role; 253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 253461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->nSize = sizeof(*comp_role); 253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 25368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d", 253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Added for parameter test */ 254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPriorityMgmt: 254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PRIORITYMGMTTYPE *priorityMgmType = 254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PRIORITYMGMTTYPE *) paramData; 25488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt"); 254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmType->nSize = sizeof(priorityMgmType); 2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Added for parameter test */ 255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamCompBufferSupplier: 255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 255761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 25598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier"); 256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nSize = sizeof(bufferSupplierType); 256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == bufferSupplierType->nPortIndex) 256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (1 == bufferSupplierType->nPortIndex) 256661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 256861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 256961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 257161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoAvc: 257461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 25758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x", 2576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoH263: 258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 25818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x", 2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg4: 258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 25878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x", 258861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg2: 259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 25938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x", 2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 259661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 259761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoProfileLevelQuerySupported: 259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 25998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex); 260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType = 260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData; 260261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_supported_profile_level_for_1080p(profileLevelType); 260361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 260461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: 260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage"); 260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 261161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED | 261461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan GRALLOC_USAGE_PRIVATE_UNCACHED); 261561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 261661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_ 261761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else 2619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED; 262061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 26218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x", (unsigned int)nativeBuffersUsage->nUsage); 262261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 26248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!"); 262561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 263161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 26338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex); 263461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedIndex; 263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 26398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)", 264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width, 264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_height, 264261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.stride, 264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.scan_lines); 2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 2654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 265561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((params == NULL) || 265661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (params->nativeBuffer == NULL) || 265761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (params->nativeBuffer->handle == NULL) || 265861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !m_enable_android_native_buffers) 2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_android_native_buffers = OMX_TRUE; 2661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sp<android_native_buffer_t> nBuf = params->nativeBuffer; 2662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private_handle_t *handle = (private_handle_t *)nBuf->handle; 266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 2664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buffer = NULL; 266561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = (OMX_U8*)mmap(0, handle->size, 2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 266861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == MAP_FAILED) { 266961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 267061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 268161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 268261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::Setparameter 2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 268461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 268561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Set Parameter method implementation. 2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 268861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 2689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 269061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 269361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 269561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE paramIndex, 269661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR paramData) 2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 26996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal int ret=0; 27006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct v4l2_format fmt; 270161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 27028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Param in Invalid State"); 2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 270561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (paramData == NULL) { 27068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Param in Invalid paramData"); 270761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 270961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state != OMX_StateLoaded) && 271061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_out_bEnabled == OMX_TRUE) && 271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_inp_bEnabled == OMX_TRUE)) { 27148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Param in Invalid State"); 2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 2716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)paramIndex) { 271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPortDefinition: 2719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 272061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 272161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 272261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has 272361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //been called. 27248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d", 272561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->format.video.nFrameHeight, 272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->format.video.nFrameWidth); 272761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_DirOutput == portDefn->eDir) { 27288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port"); 272961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_display_id = portDefn->format.video.pNativeWindow; 273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffer_size; 273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_buffer_req(buffer_size)) { 27328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error in getting buffer requirements"); 273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 273561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount && 273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size ) { 273761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual; 273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size = portDefn->nBufferSize; 273961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(&drv_ctx.op_buf); 274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_port_def = *portDefn; 274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 27438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)", 274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size, 274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual, portDefn->nBufferSize); 274661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 274761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 274961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (OMX_DirInput == portDefn->eDir) { 275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((portDefn->format.video.xFramerate >> 16) > 0 && 275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) { 275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Frame rate only should be set if this is a "known value" or to 275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // activate ts prediction logic (arbitrary mode only) sending input 275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // timestamps with max value (LLONG_MAX). 275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu", 275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.xFramerate >> 16); 275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator); 275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.frame_rate.fps_numerator) { 276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 30; 276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator) 276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = (int) 276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator; 276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", 277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int, drv_ctx.frame_rate.fps_numerator / 277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)drv_ctx.frame_rate.fps_denominator); 277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 27738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port"); 277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_resolution.frame_height != 277561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight || 277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width != 277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth) { 27788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("SetParam IP: WxH(%d x %d)", 277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth, 278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight); 278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portDefn->format.video.nFrameHeight != 0x0 && 278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth != 0x0) { 278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan update_resolution(portDefn->format.video.nFrameWidth, 278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight); 278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 27898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width); 279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 27928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Resolution failed"); 279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) { 279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf; 280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) & 280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (~(buffer_prop->alignment - 1)); 280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(buffer_prop); 280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 28058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)", 280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size, 280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual, portDefn->nBufferSize); 280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 281061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portDefn->eDir == OMX_DirMax) { 281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->nPortIndex); 281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoPortFormat: 2818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret=0; 282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 28238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d", 282461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat); 282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (1 == portFmt->nPortIndex) { 282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 282861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum vdec_output_fromat op_format; 283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) || 283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar)) 283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12; 283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (portFmt->eColorFormat == 283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_COLOR_FORMATTYPE) 283861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka) 283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_format = VDEC_YUV_FORMAT_TILE_4x2; 284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.output_format = op_format; 284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 284661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 28478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set output format failed"); 284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.set_color_format(portFmt->eColorFormat)) { 28568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set color format failed"); 285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexPortDefn: 2865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt = 286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData; 28688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d", 286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nFramePackingFormat); 287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 287161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Input port */ 287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portFmt->nPortIndex == 0) { 287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) { 287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session"); 287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = true; 288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portFmt->nFramePackingFormat == 288261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_FramePacking_OnlyOneCompleteFrame) { 288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 28858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu", 288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nFramePackingFormat); 288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 28908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port"); 289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid && 289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nMemRegion < OMX_QCOM_MemRegionMax) && 289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) { 289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_region_smi = OMX_TRUE; 289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 28968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set"); 289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem = OMX_TRUE; 289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamStandardComponentRole: 29056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal { 290661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_COMPONENTROLETYPE *comp_role; 290761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 29088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s", 290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->cRole); 291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 291161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded)&& 291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Set Parameter called in valid state"); 291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 291961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 294661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 294761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 295361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) 295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) { 295861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 296261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 296361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 296461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 296561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) { 296761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) || 297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) { 297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind); 298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 29856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPriorityMgmt: 2988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state != OMX_StateLoaded) { 29908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 299261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 29948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d", 299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmtype->nGroupID); 2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 29978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d", 299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmtype->nGroupPriority); 2999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 3002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 300661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamCompBufferSupplier: 30076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal { 300861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 30098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d", 301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->eBufferSupplier); 301161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 301361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 301461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 301561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 301761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 30206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoAvc: 302261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d", 302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 302661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoH263: 302861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d", 303061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg4: 303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d", 303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg2: 304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 30418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d", 304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoDecoderPictureOrder: 304661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder = 304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData; 304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 305061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pic_order,rc=0; 30518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d", 305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pictureOrder->eOutputPictureOrder); 305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) { 305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) { 305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = pic_order; 306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 30658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set picture order failed"); 306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamConcealMBMapExtraData: 307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false, 307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 30768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamFrameInfoExtraData: 308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false, 308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 30868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamInterlaceExtraData: 309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false, 309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 30968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamH264TimeInfo: 310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) 310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false, 310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 31058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("secure mode setting not supported"); 310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoDivx: 311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData; 311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexPlatformPvt: 311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 31168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port"); 311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData; 311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type); 312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_pvt_entry_pmem = OMX_TRUE; 312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 31248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set"); 312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem = OMX_TRUE; 312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 312861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoSyncFrameDecodingMode: 313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 313361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 313461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode"); 313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 313761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.idr_only_decoding = 1; 313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 313961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 31428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set picture order failed"); 314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE; 314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE; 314761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 31498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Sync frame setting failed"); 315061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 315161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 315261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 315361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 315461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamIndexExtraDataType: 315761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData; 316061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) && 316161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (extradataIndexType->bEnabled == OMX_TRUE) && 316261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (extradataIndexType->nPortIndex == 1)) { 31638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming"); 316461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled); 316561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 316661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 317061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamEnableSmoothStreaming: 3171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 317261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 317461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER; 317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = 1; 317661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 317761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc < 0) { 317861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver."); 317961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorHardware; 318061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 318161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 318261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 318461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Need to allow following two set_parameters even in Idle 318561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * state. This is ANDROID architecture which is not in sync 318661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * with openmax standard. */ 318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: 318861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 318961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 319061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enableNativeBuffers) { 319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_enable_android_native_buffers = enableNativeBuffers->enable; 319261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 319361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 319461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: 319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = use_android_native_buffer(hComp, paramData); 319861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 320161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamEnableTimeStampReorder: 320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData; 320461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) { 320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (reorder->bEnable == OMX_TRUE) { 320661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int =0; 320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(true); 320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 321061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (reorder->bEnable == OMX_TRUE) { 321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 321461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 321861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 32208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex); 322161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedIndex; 322261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 322361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetConfig 3230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 323161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 323261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Get Config Method implementation. 3233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 323561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 3239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 324061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp, 324261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE configIndex, 324361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_PTR configData) 3244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 324561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 3246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 324761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 32488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Config in Invalid State"); 324961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 325061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 325161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 325261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)configIndex) { 325361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexConfigInterlaced: 325461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_CONFIG_INTERLACETYPE *configFmt = 325661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_CONFIG_INTERLACETYPE *) configData; 325761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configFmt->nPortIndex == 1) { 325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configFmt->nIndex == 0) { 325961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive; 326061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configFmt->nIndex == 1) { 326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = 326261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 326361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configFmt->nIndex == 2) { 326461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = 326561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 326761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:" 32688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore Interlaced formats"); 326961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 327061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 327161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 327261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 32738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port", 327461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)configFmt->nPortIndex); 327561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 327661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 327761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 327861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 327961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexQueryNumberOfVideoDecInstance: 328061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 328161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances = 328261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData; 328361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoderinstances->nNumOfInstances = 16; 328461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 328561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 328661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 328761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexConfigVideoFramePackingArrangement: 328861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 328961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 329061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt = 329161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData; 329261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->get_frame_pack_data(configFmt); 329361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 329461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs"); 329561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 329661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 329761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 329861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexConfigCommonOutputCrop: 329961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 330061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 330161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE)); 330261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 330361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 330461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 33068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex); 330761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 331161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 331261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 331761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SetConfig 3318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 331961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 332061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Set Config method implementation 3321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 332261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 332361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 332561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 332661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 332761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp, 332961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE configIndex, 333061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR configData) 3331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 333261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 33338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Config in Invalid State"); 333461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 333561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 333661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 333761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 333861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_CONFIG_NALSIZE *pNal; 333961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set Config Called"); 334161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 334261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateExecuting) { 33438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("set_config:Ignore in Exe state"); 334461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 334561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 334761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) { 334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData; 33498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData called"); 335061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) { 33518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData AVC"); 335261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 extra_size; 335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Parsing done here for the AVC atom is definitely not generic 335461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Currently this piece of code is working, but certainly 335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // not tested with all .mp4 files. 335661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Incase of failure, we might need to revisit this 335761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // for a generic piece of code. 335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Retrieve size of NAL length field 336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // byte #4 contains the size of NAL lenght field 336161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length = (config->pData[4] & 0x03) + 1; 336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 336361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_size = 0; 336461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length > 2) { 336561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Presently we assume that only one SPS and one PPS in AvC1 Atom */ 336661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_size = (nal_length - 2) * 2; 336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 336861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // SPS starts from byte #6 337061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]); 337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pDestBuf; 3372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 337461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // minus 6 --> SPS starts from byte #6 337561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // minus 1 --> picture param set byte to be ignored from avcatom 337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size; 337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize); 337861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 len; 337961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 index = 0; 338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // case where SPS+PPS is sent as part of set_config 338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf = m_vendor_config.pData; 338261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]", 338461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex, 338561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize, 338661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData); 338761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (index < 2) { 338861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan uint8 *psize; 338961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = *pSrcBuf; 339061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = len << 8; 339161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len |= *(pSrcBuf + 1); 339261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psize = (uint8 *) & len; 339361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(pDestBuf + nal_length, pSrcBuf + 2,len); 339461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (unsigned int i = 0; i < nal_length; i++) { 339561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf[i] = psize[nal_length - 1 - i]; 339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 339761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //memcpy(pDestBuf,pSrcBuf,(len+2)); 339861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pDestBuf += len + nal_length; 339961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pSrcBuf += len + 2; 340061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index++; 340161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pSrcBuf++; // skip picture param set 340261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan len = 0; 340361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 340461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") || 340561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) { 3406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 3407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize = config->nDataSize; 340861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize)); 340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData,config->nDataSize); 341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) { 341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_vendor_config.pData) { 341261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_vendor_config.pData); 341361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = NULL; 341461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = 0; 341561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 341661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (((*((OMX_U32 *) config->pData)) & 341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE_MASK) == 341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE) { 34208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 simple/main profile"); 342161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 342261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 342361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = 342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *) malloc(config->nDataSize); 342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData, 342661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan config->nDataSize); 342761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_SP_MP_RCV; 342861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) { 34298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 Advance profile"); 343061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 343161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = 343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *) malloc((config->nDataSize)); 343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData, config->pData, 343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan config->nDataSize); 343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_AP; 343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) { 34388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only"); 343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nPortIndex = config->nPortIndex; 344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.nDataSize = config->nDataSize; 344161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize); 344261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(m_vendor_config.pData,config->pData,config->nDataSize); 344361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile = VC1_SP_MP_RCV; 344461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 34458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile"); 344661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 344861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 344961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configIndex == OMX_IndexConfigVideoNalSize) { 345061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 345161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData); 345261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length = pNal->nNaluBytes; 345361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 34548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d",nal_length); 345561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 345861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 3459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 346261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 346361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetExtensionIndex 3464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 346561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 346661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX GetExtensionIndex method implementaion. <TBD> 3467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 346861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 346961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 347161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 347461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 347661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_STRING paramName, 347761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_INDEXTYPE* indexType) 3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 347961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 34808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Extension Index in Invalid State"); 3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 348261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) { 3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode; 348461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) { 3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType; 3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 348861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) { 3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 349061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) { 3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 349261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) { 34938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extension: %s is supported", paramName); 3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 349561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) { 3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 349961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 35008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName); 3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNotImplemented; 3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 350761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 350861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetState 3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 351061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 351161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns the state information back to the caller.<TBD> 3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 351361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 351461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 351661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 351761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Error None if everything is successful. 351861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp, 352061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STATETYPE* state) 3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 352261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *state = m_state; 35238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_state: Returning the state %d",*state); 352461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 352861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 352961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentTunnelRequest 3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 353161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 353261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Component Tunnel Request method implementation. <TBD> 3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 353461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 353561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 353761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 353861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 354061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 354261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 354361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE peerComponent, 354461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 peerPort, 354561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 35478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented"); 354861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 355261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 355361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseOutputBuffer 3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 355561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 355661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper function for Use buffer in the input pin 3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 355861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 355961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 356161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 356261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 3563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 356461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 35656eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_extradata() 35666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 35676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 356861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.buffer_size) { 356961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) { 357061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 357161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 357261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 357361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 357461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095); 35758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("allocate extradata memory size %d", drv_ctx.extradata_info.size); 357661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory( 357761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size, 4096, 357861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.extradata_info.ion.ion_alloc_data, 357961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.extradata_info.ion.fd_ion_data, 0); 358061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.ion.ion_device_fd < 0) { 35818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to alloc extradata memory"); 358261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 358361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 358461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.uaddr = (char *)mmap(NULL, 358561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size, 358661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, 358761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.ion.fd_ion_data.fd , 0); 358861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.uaddr == MAP_FAILED) { 35898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to map extradata memory"); 359061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 359161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 359261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 359361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 359461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size); 359561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 35966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 359761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 35986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 35996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 360061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_extradata() 360161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 36026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 360361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.uaddr) { 360461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 360561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 360661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 360761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 360861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 36096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 36106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 36116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 3612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_output_buffer( 361361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 361461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 361561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 361661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 361761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 361861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 362061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 362161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 362261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; // Temporary counter 362361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 362461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PTR privateAppData = NULL; 362561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan private_handle_t *handle = NULL; 362661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *buff = buffer; 362761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 362861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 362961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 36306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 363161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 363261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers"); 363361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_output_headers(); 363461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 363561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_extradata(); 363661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 363761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 363861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 363961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 364061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,i)) { 364161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 364261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 364461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 364561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 364661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i >= drv_ctx.op_buf.actualcount) { 36478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount); 364861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 364961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 365161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 365261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 365361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 365461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_use_android_native_buffers) { 365561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 365661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sp<android_native_buffer_t> nBuf = params->nativeBuffer; 365761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle = (private_handle_t *)nBuf->handle; 365861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = params->pAppPrivate; 365961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 366061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle = (private_handle_t *)buff; 366161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 366261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 366361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 366461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 366561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 366661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " expected %u, got %lu", 366761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size); 366861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 366961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 367061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 367161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size; 367261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_use_android_native_buffers) { 367361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 367461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buff = (OMX_U8*)mmap(0, handle->size, 367561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 367661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buff == MAP_FAILED) { 367761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 367861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 367961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 36816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 36826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#if defined(_ANDROID_ICS_) 368361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan native_buffer[i].nativehandle = handle; 368461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan native_buffer[i].privatehandle = handle; 36856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 368661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!handle) { 368761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 368861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 368961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 369061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 369161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = 0; 369261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 369361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = 369461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 369561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 3696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 369861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ouput_egl_buffers && !m_use_output_pmem) { 3699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 37008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("allocate output buffer memory size %d", drv_ctx.op_buf.buffer_size); 370161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 370261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 370361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 370461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0); 370561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 37068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd); 370761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 370861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 370961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 371061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 3711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 371261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 371361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan open (MEM_DEVICE,O_RDWR); 3714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 371561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 37168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 371761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 371861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 372061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */ 372161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) { 372261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 372361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan open (MEM_DEVICE,O_RDWR); 372461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 37258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 372661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 372761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 372861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 373061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 373161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size, 373261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment)) { 37338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 373461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 373561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 373661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 373861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 373961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 374061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 374161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, 374261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 374361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 374461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 3745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 374661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 3747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 37488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unable to mmap output buffer"); 374961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 375061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 375161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 375261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = 0; 375361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 375461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 375561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 375661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem); 375761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!appData || !bytes ) { 375861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && !buffer) { 37598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case"); 376061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 376161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 376261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 376361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 376461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 376561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 376661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 376761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pmem_list->entryList || !pmem_list->entryList->entry || 376861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !pmem_list->nEntries || 376961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 37708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pmem info not valid in use buffer"); 377161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 377261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 377361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 377461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list->entryList->entry; 377561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x", 377661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info->pmem_fd); 377761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 377861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 377961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 378061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = 378161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 378261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 3783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 378461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 378561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd; 378661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 378761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_out_mem_ptr + i ); 378861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 378961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 379061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 379161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 379261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 379361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 37948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i, 379561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr, 379661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd ); 379761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 379861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 379961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 380061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 380161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 380261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 380361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 380461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd; 380561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 380661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 380761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 380861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 380961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 381061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 381161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION 381261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 381361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 381461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 381561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 381661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 38178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 381861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 3819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 382061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 382161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 382261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]); 3824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 382561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) { 38268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to prepare bufs"); 382761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 382861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 3829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 383161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) { 383261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 383361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 383461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) { 383561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 383661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 383761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = true; 38388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("STREAMON Successful"); 383961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 384161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 384261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 384361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 384461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle); 384561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = (OMX_U8 *)handle; 384661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 384761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = buff; 384861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 384961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pAppPrivate = privateAppData; 385061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_out_bm_count,i); 385161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 385261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 385661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 385761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::use_input_heap_buffers 3858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 385961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 386061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use Buffer Heap allocation method implementation. 3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 386261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 386361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 386561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 386661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None , if everything successful. 3867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 386861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_input_heap_buffers( 387061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 387161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 387261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 387361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 387461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 387561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 38778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer); 387861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 387961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_heap_ptr) 388061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 388161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 388261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 388361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_phdr_pmem_ptr) 388461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 388561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 388661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 388761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) { 388861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficent memory"); 388961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 389061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) { 389161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_use_buffer = true; 389261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 389361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 389461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 389561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 389661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 389761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 389861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 389961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 39008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 390161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], 390261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 39038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 390461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 390561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 390661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_in_alloc_cnt++; 390761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 390861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("All i/p buffers have been set!"); 390961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 391061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 391161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 391561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 391661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseBuffer 3917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 391861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 391961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use Buffer method implementation. 3920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 392161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 392261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 392461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 392561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None , if everything successful. 3926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 392761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_buffer( 392961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 393061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 393161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 393261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 393361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 393461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 3935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 393661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE error = OMX_ErrorNone; 393761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 393861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 393961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || bytes == 0) { 394061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && buffer == NULL) { 394161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer); 394261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 394361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 394461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 394561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 39468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Use Buffer in Invalid State"); 394761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 394861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 394961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) 395061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 395161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (port == OMX_CORE_OUTPUT_PORT_INDEX) 395261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested 395361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 39548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 395561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = OMX_ErrorBadPortIndex; 395661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 395761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error); 395861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error == OMX_ErrorNone) { 395961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 396061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 396161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 396261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandStateSet,OMX_StateIdle, 396361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 396461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 396561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 396661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 396761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 396861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 396961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX, 397061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 397161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 397261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 397361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 397461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 397561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 397661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 397761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 397861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 397961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return error; 398061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 3981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex, 398361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *pmem_bufferHdr) 3984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 398561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) { 398661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr[bufferindex].pBuffer) 398761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_inp_heap_ptr[bufferindex].pBuffer); 398861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[bufferindex].pBuffer = NULL; 398961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 399061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_bufferHdr) 399161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(pmem_bufferHdr); 399261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 3993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 3996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 399761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 399861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || m_inp_mem_ptr == NULL) { 399961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 400061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 400261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufferHdr - m_inp_mem_ptr; 40038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 400461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 400561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) { 40068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 400761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) { 400861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 400961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT; 401061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 401161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 40128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the input buffer fd=%d", 4013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].pmem_fd); 40148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the input buffer size=%d address = %d", 4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].mmaped_size, 4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].bufferaddr); 401761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 401861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].mmaped_size); 401961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.ptr_inputbuffer[index].pmem_fd); 402061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 402161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) { 402261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_desc_buffer_ptr[index].buf_addr); 402361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].buf_addr = NULL; 402461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].desc_data_size = 0; 402561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 402761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 4028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 402961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 403261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 4033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 403761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 4038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 403961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || m_out_mem_ptr == NULL) { 404061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 404161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 404361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufferHdr - m_out_mem_ptr; 40448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index); 4045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 404661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < drv_ctx.op_buf.actualcount 404761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_outputbuffer) { 40488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %x", index, 404961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].bufferaddr); 4050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 405161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 405261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 405361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 405461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 4055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 405661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 405761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 405861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 405961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].mmaped_size); 406061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 406161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 406261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 4063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 406461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) { 40658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the output buffer fd = %d", 406661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].pmem_fd); 40678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the ouput buffer size=%d address = %d", 406861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount, 406961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].bufferaddr); 407061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr, 407161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount); 407261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (drv_ctx.ptr_outputbuffer[0].pmem_fd); 407361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].pmem_fd = -1; 4074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 407561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[0]); 4076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 407761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 407961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 408161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 408261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_extradata(); 408361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 40846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 4085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 408661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 4087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 409161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE **bufferHdr, 409261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 port, 409361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PTR appData, 409461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 bytes) 4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 409661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *input = NULL; 409761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *buf_addr = NULL; 409861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 409961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i = 0; 410061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 410161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Sanity Check*/ 410261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL) { 410361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 410461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 410561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 410661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr == NULL) { 410761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 410861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 410961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 411061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 411161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 411261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 411361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 411461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr == NULL) { 41158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("m_inp_heap_ptr Allocation failed "); 411661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 411761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 411861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 411961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 412061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Find a Free index*/ 412161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 412261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) { 41238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 412461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 412561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 412661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 412761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 412861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.ip_buf.actualcount) { 412961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 413061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 413161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_addr == NULL) { 413261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 413361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 413461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 413561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_inp_heap_ptr + i); 413661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input = *bufferHdr; 413761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_heap_inp_bm_count,i); 413861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 413961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)buf_addr; 414061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 414161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nVersion.nVersion = OMX_SPEC_VERSION; 414261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nAllocLen = drv_ctx.ip_buf.buffer_size; 414361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pAppPrivate = appData; 414461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 41458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr ); 414661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 41478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]); 414861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Add the Buffers to freeq*/ 414961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i], 415061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 41518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 415261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 415361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 415461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 415561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 415661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 415761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 415861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 416461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 416561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateInputBuffer 4166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 416761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 416861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper function for allocate buffer in the input pin 4169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 417061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 417161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 417361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 417461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 417661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_buffer( 417861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 417961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 418061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 418161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 418261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 418561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 418661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 418761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *input = NULL; 418861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i = 0; 418961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *buf_addr = NULL; 419061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pmem_fd = -1; 4191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bytes != drv_ctx.ip_buf.buffer_size) { 41938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Requested Size is wrong %d epected is %d", 419461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes, drv_ctx.ip_buf.buffer_size); 419561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 419661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_mem_ptr) { 41998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%d)", 420061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount, 420161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size); 4202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 420361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 420461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 4205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 420661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr == NULL) { 420761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 420861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 421061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \ 421161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount); 4212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 421361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer == NULL) { 421461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 421561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 421761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \ 421861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount); 4219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 422061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ip_buf_ion_info == NULL) { 422161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 422261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 422561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.ip_buf.actualcount; i++) { 422661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 4227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 422861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 4229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 423061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 423361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 423461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 42358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 423661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 423761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 424061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.ip_buf.actualcount) { 424161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 424261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 424361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 42446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 42468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Allocate input Buffer size %d", drv_ctx.ip_buf.buffer_size); 424761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 424861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 424961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 425061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0); 425161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 425261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 425361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 425461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 4255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 425661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 425861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 42598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 426061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 426161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 426361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd == 0) { 426461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 426661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 42678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 426861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 426961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 427061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 427261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size, 427361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment)) { 42748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 427561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 427661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 427761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 427961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 428061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_addr = (unsigned char *)mmap(NULL, 428161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size, 428261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 4283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 428461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_addr == MAP_FAILED) { 428561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 4286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 428761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 4288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 42898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Map Failed to allocate input buffer"); 429061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 429161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 429261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 429361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_inp_mem_ptr + i); 429461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 429561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr; 429661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 429761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 429861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 429961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 430061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 430161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].offset = 0; 430261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 430361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 430461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 430561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 430661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 430761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.bytesused = 0; 430861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size; 430961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr; 431061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd; 431161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[1] = 0; 431261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset; 431361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = &plane; 431461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = 1; 431561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]); 431761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 431861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 431961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 432061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 43218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to prepare bufs"); 432261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 432361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 4324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 432661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input = *bufferHdr; 432761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_inp_bm_count,i); 43288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr); 432961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 433061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd; 433161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 433261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)buf_addr; 433361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 433461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nVersion.nVersion = OMX_SPEC_VERSION; 433561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nAllocLen = drv_ctx.ip_buf.buffer_size; 433661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pAppPrivate = appData; 433761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 433861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; 433961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 434061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.disable_dmx) { 434161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_desc_buffer(i); 434261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 434361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found"); 434561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 434661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 434761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 435261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 435361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateOutputBuffer 4354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 435561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 435661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper fn for AllocateBuffer in the output pin 4357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 435861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 435961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 4360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 436161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 436261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went well. 4363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 436461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_buffer( 436661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 436761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 436861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 436961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 437061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 437261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 437361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 437461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; // Temporary counter 437561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 437661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 437861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ion_device_fd =-1; 437961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_allocation_data ion_alloc_data; 438061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_fd_data fd_ion_data; 4381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 438261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 43838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%d)", 438461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount, 438561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 438661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nBufHdrSize = 0; 438761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformEntrySize = 0; 438861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformListSize = 0; 438961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPMEMInfoSize = 0; 439061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pmem_fd = -1; 439161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *pmem_baseaddress = NULL; 439261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 439361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 439461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 439561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 439661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)", 439861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 439961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufHdrSize = drv_ctx.op_buf.actualcount * 440061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE); 440161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 440261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize = drv_ctx.op_buf.actualcount * 440361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 440461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize = drv_ctx.op_buf.actualcount * 440561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 440661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformEntrySize = drv_ctx.op_buf.actualcount * 440761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 440861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize, 441061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE), 441161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize, 441261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize); 44138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize, 441461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 44168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("allocate outputBuffer size %d",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount); 441761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_device_fd = alloc_map_ion_memory( 441861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount, 441961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment, 442061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0); 442161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ion_device_fd < 0) { 442261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 442361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 442461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = fd_ion_data.fd; 4425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 442661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 442861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 44298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d", 443061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 443161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 443261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 443461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd == 0) { 443561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 4436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 443761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 44388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d", 443961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 444061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 444161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 444261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 444461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size * 444561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount, 444661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment)) { 44478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 444861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 444961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 445061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 445261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 445361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress = (unsigned char *)mmap(NULL, 445461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.op_buf.buffer_size * 445561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount), 445661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 445761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_baseaddress == MAP_FAILED) { 44588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("MMAP failed for Size %d", 445961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 446061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 4461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 446261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 4463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 446461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 446561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 446661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 446761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 446861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Alloc mem for platform specific info 446961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *pPtr=NULL; 447061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 447161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize,1); 447261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\ 447361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_bufferpayload), 447461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 447561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 447661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo), 447761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 447961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = (struct vdec_ion *)\ 448061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_ion), 448161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 4482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 448461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_respbuffer) { 448661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size = 448761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.op_buf.buffer_size * 448861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 448961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr = m_out_mem_ptr; 449061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 449161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 449261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_list) + nPlatformListSize); 449361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 449461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_entry) + nPlatformEntrySize); 449561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList = m_platform_list; 449661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry = m_platform_entry; 449761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = m_pmem_info; 449861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 450061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 450161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Settting the entire storage nicely 45028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry); 45038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 450461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 450561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 450661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 450761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Set the values when we determine the right HxW param 450861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nAllocLen = bytes; 450961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nFilledLen = 0; 451061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pAppPrivate = appData; 451161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 451261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Platform specific PMEM Information 451361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform Entry 45148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i); 451561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 451661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->entry = pPMEMInfo; 451761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform List 451861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->nEntries = 1; 451961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->entryList = pPlatformEntry; 452061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep pBuffer NULL till vdec is opened 452161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pBuffer = NULL; 452261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOffset = 0; 452361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 452461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i; 452561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->pmem_fd = 0; 452661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pPlatformPrivate = pPlatformList; 452761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 452861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd; 452961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].pmem_fd = pmem_fd; 4530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 453161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd; 453261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data; 453361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data; 4534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 453661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create a mapping between buffers*/ 453761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 453861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 453961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ptr_outputbuffer[i]; 454061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i; 454161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 454261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i); 454361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 45448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pmem_fd = %d offset = %d address = %p", 454561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd, drv_ctx.ptr_outputbuffer[i].offset, 454661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr); 454761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the buffer and buffer header pointers 454861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr++; 454961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo++; 455061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry++; 455161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList++; 455261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 455361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 45548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 455561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr, pPtr); 455661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 455761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_out_mem_ptr); 455861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 455961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 456061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pPtr) { 456161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(pPtr); 456261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = NULL; 456361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 456461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 456561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_outputbuffer); 456661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 456761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 456861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 456961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_respbuffer); 457061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 457161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 457361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info) { 45748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 457561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 457661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = NULL; 457761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 457961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 458061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 458161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 458261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_extradata(); 458361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 458461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 458561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 458661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,i)) { 45878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i); 458861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 458961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 459261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 459361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.op_buf.actualcount) { 459461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 459561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 459661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 459761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 459861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 459961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = 460061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size; 460161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 460261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_out_mem_ptr + i ); 460361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 460461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 460561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 460661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size; 460761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 460861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 460961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 461061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 461161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 461261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 461361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 46146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 461561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 46166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 461761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 461861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 461961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 462061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 462161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 462261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 4623b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION 462461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 4625b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif 462661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 462761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 462861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 46298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx); 463061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 463161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 463261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 463361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 46348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]); 463561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 463661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 463761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 463861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 463961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 464061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 464161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 464261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 464361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 464461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 464561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 464661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 464761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 464861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = true; 46498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("STREAMON Successful"); 465061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 465161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 465261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 465361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 465461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pAppPrivate = appData; 465561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_out_bm_count,i); 465661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 46578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient"); 465861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 465961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 466261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer -- API Call 4667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 466861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 466961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateBuffer 4670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 467161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 467261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 4673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 467461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 467561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 467761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 467861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 468061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 468261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 468361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 468461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 468561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i = 0; 4688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 4689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 46908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port); 469161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 46928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Allocate Buf in Invalid State"); 4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 469661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 469761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 469861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes); 469961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 470061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); 470161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 470261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 47036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port, 47046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal appData,bytes); 470561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 47068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 470761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 4708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 471061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 471161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done()) { 471261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 4713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet,OMX_StateIdle, 471661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 471961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) { 472061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 472161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 472261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 4723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX, 4724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 472561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 472761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) { 472861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 472961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 4730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 473161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 473261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 47368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet); 4737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call 4741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 474261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 474361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::FreeBuffer 4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 474561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 474761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 474861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 475061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 475161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 4752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 475361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 475561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 475661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 4757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 4759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int nPortIndex; 47608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("In for decoder free_buffer"); 4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 476261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateIdle && 476361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 47648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" free buffer while Component in Loading pending"); 476561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 476661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) { 47678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Buffer while port %d disabled", port); 476861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((port == OMX_CORE_INPUT_PORT_INDEX && 476961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) || 477061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (port == OMX_CORE_OUTPUT_PORT_INDEX && 477161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) { 47728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Buffer while port %d enable pending", port); 477361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) { 47748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled"); 4775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 477661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorPortUnpopulated, 477761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 478061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_state != OMX_StateInvalid) { 47818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers"); 4782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 478361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorPortUnpopulated, 478461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 478761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 478861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if arbitrary bytes*/ 478961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes && !input_use_buffer) 479061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer - m_inp_mem_ptr; 479161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 479261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer - m_inp_heap_ptr; 4793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 47948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex); 479561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex < drv_ctx.ip_buf.actualcount) { 479661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Clear the bit associated with it. 479761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 479861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 479961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 480061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 48018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex); 480261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) 480361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 480461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 480561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 480661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) 480761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]); 480861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 480961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(nPortIndex,NULL); 481061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 481161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(buffer); 4812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 481361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated = OMX_FALSE; 481461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Free the Buffer Header*/ 481561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_input_done()) { 48168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("ALL input buffers are freed/released"); 481761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer_header(); 481861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 481961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 48208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid"); 4821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 482461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 482561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_input_done()) { 48268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 4827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 4828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortDisable, 482961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX, 483061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 483261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // check if the buffer is valid 48346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 483561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex < drv_ctx.op_buf.actualcount) { 48368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex); 4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Clear the bit associated with it. 4838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 4839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bPopulated = OMX_FALSE; 48406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal client_buffers.free_output_buffer (buffer); 4841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 484261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 484361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_output_buffer_header(); 4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 484561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 48468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid"); 4847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 484961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 485061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_output_done()) { 48518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it"); 4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 485461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 48556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_ 485661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 485761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 485861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 485961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 48606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 4861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 486261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable, 486361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 486461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 486661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 486961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((eRet == OMX_ErrorNone) && 487061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 487161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_done()) { 4872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 4874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet, OMX_StateLoaded, 487561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 4876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 488361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 488461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::EmptyThisBuffer 4885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 488661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 488761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan This routine is used to push the encoded video frames to 488861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the video decoder. 4889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 489061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 489161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 4892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 489361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 489461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went successful. 4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 489661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 489861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 490061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret1 = OMX_ErrorNone; 490161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 49038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 49048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan codec_config_flag = true; 49058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__); 49068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 490761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 49088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Empty this buffer in Invalid State"); 490961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 491061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 491261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL) { 49138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL"); 491461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 491561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 491761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_bEnabled) { 49188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled."); 491961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 492061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 492261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) { 49238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %lu", buffer->nInputPortIndex); 492461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 492561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 492761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 492861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!latency) { 492961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.stop(); 493061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan latency = dec_time.processing_time_us(); 493161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 493261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 493361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 493461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 493561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 493661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_heap_ptr; 493761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 493861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 493961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_heap_ptr; 494061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 494161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 494261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 494361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = &m_inp_mem_ptr[nBufferIndex]; 494461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d", 494561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen); 494661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 494761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_mem_ptr; 494861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 494961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 495061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 495161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nBufferIndex > drv_ctx.ip_buf.actualcount ) { 49528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid"); 495361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 495461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 495561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 495661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)", 495761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen); 495861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 495961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned)hComp,(unsigned)buffer, 496061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_ETB_ARBITRARY); 496161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 496261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_TIMEINFO_EXTRADATA)) 496361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(buffer->nTimeStamp); 496461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB); 496561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 496761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 496861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 496961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/* ====================================================================== 497061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 497161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::empty_this_buffer_proxy 497261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 497361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 497461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan This routine is used to push the encoded video frames to 497561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the video decoder. 497661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 497761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 497861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 497961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 498061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 498161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went successful. 498261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 498361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 498461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 498561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 498661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 498761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int push_cnt = 0,i=0; 498861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned nPortIndex = 0; 498961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 499061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_input_frameinfo frameinfo; 499161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *temp_buffer; 499261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_seqheader seq_header; 499361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool port_setting_changed = true; 499461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool not_coded_vop = false; 499561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 499661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Should we generate a Aync error event*/ 499761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || buffer->pInputPortPrivate == NULL) { 49988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid"); 499961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 500061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 500161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 500261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 500361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 500461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nPortIndex > drv_ctx.ip_buf.actualcount) { 50058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 500661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex); 500761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 500861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 500961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 501061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers++; 501161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 501261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return zero length and not an EOS buffer */ 501361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes && (buffer->nFilledLen == 0) && 501461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) { 50158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("return zero legth buffer"); 501661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 501761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 501861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 501961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 502261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) { 502361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4StreamType psBits; 502461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset); 502561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.numBytes = buffer->nFilledLen; 502661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4_headerparser.parseHeader(&psBits); 502761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan not_coded_vop = mp4_headerparser.is_notcodec_vop( 502861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 502961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (not_coded_vop) { 50308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Found Not coded vop len %lu frame number %u", 503161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen,frame_count); 503261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 50338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Eos and Not coded Vop set len to zero"); 503461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan not_coded_vop = false; 503561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 503661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 504061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_flush_progress == true 5041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 504261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || not_coded_vop 5043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 504461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 50458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush in progress return buffer "); 504661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 504761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 504861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 504961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 505061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 505161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate; 505261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 505361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) { 505461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 505561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 505661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 50578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 505861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*for use buffer we need to memcpy the data*/ 505961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer->buffer_len = buffer->nFilledLen; 506061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 506161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer) { 506261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen <= temp_buffer->buffer_len) { 506361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 506461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 506561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 506661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset), 506761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen); 506861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 506961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 507061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 507161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 507261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 507361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 507461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 507561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr = temp_buffer->bufferaddr; 507661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.client_data = (void *) buffer; 507761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.datalen = temp_buffer->buffer_len; 507861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags = 0; 507961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.offset = buffer->nOffset; 508061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_fd = temp_buffer->pmem_fd; 508161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_offset = temp_buffer->offset; 508261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.timestamp = buffer->nTimeStamp; 508361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) { 508461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("ETB: dmx enabled"); 508561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_demux_entries == 0) { 508661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extract_demux_addr_offsets(buffer); 508761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 508861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 508961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries); 509061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle_demux_data(buffer); 509161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr; 509261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size; 509361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 509461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_addr = NULL; 509561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_size = 0; 509661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 509761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 509861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= buffer->nFlags; 5099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 510261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 510361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 51048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 510561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.insert_ts(buffer->nTimeStamp); 510661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 51078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 510861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.insert_ts(buffer->nTimeStamp); 510961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 511061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 511461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (inputBufferFile1) { 511561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fwrite((const char *)temp_buffer->bufferaddr, 511661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer->buffer_len,1,inputBufferFile1); 511761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 512061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { 512161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 512261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 512361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 512461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 512561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 51268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached"); 512761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= VDEC_BUFFERFLAG_EOS; 512861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 512961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count = 0; 513061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 513161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count = 0; 513261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) 513361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 513461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.flush(); 513561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 513661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = 0; 513761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 513861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 513961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 514061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 514161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 514261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&buf, 0, sizeof(buf)); 514361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&plane, 0, sizeof(plane)); 514461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 514561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned long print_count; 514661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 51478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan buf.flags = V4L2_QCOM_BUF_FLAG_EOS; 51488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("INPUT EOS reached") ; 514961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 515061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 515161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = nPortIndex; 515261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 515361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 515461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.bytesused = temp_buffer->buffer_len; 515561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.length = drv_ctx.ip_buf.buffer_size; 515661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.m.userptr = (unsigned long)temp_buffer->bufferaddr - 515761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)temp_buffer->offset; 515861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[0] = temp_buffer->pmem_fd; 515961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[1] = temp_buffer->offset; 516061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.data_offset = 0; 516161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = &plane; 516261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = 1; 516361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frameinfo.timestamp >= LLONG_MAX) { 516461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID; 516561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 516661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //assumption is that timestamp is in milliseconds 516761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.timestamp.tv_sec = frameinfo.timestamp / 1000000; 516861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000); 516961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0; 517061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 517161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 517261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 51738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver"); 517461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 517561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 51768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan codec_config_flag = false; 51778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("%s: codec_config cleared", __FUNCTION__); 51788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 517961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!streaming[OUTPUT_PORT]) { 518061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 518161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret,r; 518261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 518361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 51848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 518561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 518661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ret) { 51878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful"); 518861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[OUTPUT_PORT] = true; 518961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 519061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 51918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT"); 519261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued"); 519361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 519461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 519561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 519661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 519761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 519861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)", 519961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen); 520061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.insert_timestamp(buffer); 5201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 520261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 5203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 520661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 520761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::FillThisBuffer 5208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 520961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 521061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL client uses this method to release the frame buffer 521161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan after displaying them. 5212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 521361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 521461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 521661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 521761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 521961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 522161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5223f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan unsigned nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 5224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 522561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 52268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("FTB in Invalid State"); 522761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 522861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 522961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 523061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_bEnabled) { 52318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled."); 523261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 523361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 523461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 523561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || 5236f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (nPortIndex >= drv_ctx.op_buf.actualcount)) { 5237f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u", 5238f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan nPortIndex, drv_ctx.op_buf.actualcount); 523961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 524061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 524161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 524261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) { 52438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex); 524461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 524561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 524661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 524761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 524861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg); 524961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 525261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 525361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::fill_this_buffer_proxy 5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 525561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 525661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL client uses this method to release the frame buffer 525761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan after displaying them. 5258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 525961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 526061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 526261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 526361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 526561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( 526761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 526861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 5269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 527061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE nRet = OMX_ErrorNone; 527161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 527261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned nPortIndex = 0; 527361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_fillbuffer_cmd fillbuffer; 527461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *ptr_outputbuffer = NULL; 527561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *ptr_respbuffer = NULL; 527661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 527761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 527861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 5279f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) { 5280f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u", 5281f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan nPortIndex, drv_ctx.op_buf.actualcount); 528261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 5283f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 528461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 52858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", 528661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferAdd, bufferAdd->pBuffer); 528761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Return back the output buffer to client*/ 528861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) { 52898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Output Buffers return flush/disable condition"); 529061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 529161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,buffer); 529261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 529361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 529461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers++; 529561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = client_buffers.get_dr_buf_hdr(bufferAdd); 529661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate; 529761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptr_respbuffer) { 529861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data; 529961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 530061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 530161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) { 530261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 530361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 530461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,buffer); 530561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers--; 530661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 530761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 530861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 530961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 531061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 531161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 531261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&buf, 0, sizeof(buf)); 531361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 531461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 531561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 531661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = nPortIndex; 531761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 531861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 531961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].bytesused = buffer->nFilledLen; 532061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 532161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = 532261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr - 532361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset; 532461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 532561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 532661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 532761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 532861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 532961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].bytesused = 0; 533061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 533161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size); 53326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 533361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 53346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 533561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size; 533661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 533761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 53388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index higher than expected: %d", extra_idx); 533961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 534061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 534161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 534261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 534361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 534461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 534561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 534661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to qbuf to driver"); 534761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinreturn OMX_ErrorNone; 5349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 535261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 535361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SetCallbacks 5354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 535561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 535661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Set the callbacks. 5357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 535861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 535961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 536161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 536261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 5363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 536461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 536661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_CALLBACKTYPE* callbacks, 536761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData) 5368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 537061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb = *callbacks; 53718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 537261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EventHandler,m_cb.FillBufferDone); 537361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_app_data = appData; 537461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 5375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 537861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 537961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentDeInit 5380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 538261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Destroys the component and release memory allocated to the heap. 5383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 538561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 538761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 538861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 5389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 539061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 53946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal unsigned i = 0; 539561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_StateLoaded != m_state) { 53968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\ 539761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state); 53988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Playback Ended - FAILED"); 539961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 54008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Playback Ended - PASSED"); 5401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the output buffers have to be cleaned up*/ 540461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 54058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Freeing the Output Memory"); 540661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) { 540761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_output_buffer (&m_out_mem_ptr[i]); 5408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 540961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_ 541061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 541161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 5412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the input buffers have to be cleaned up*/ 541561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr || m_inp_heap_ptr) { 54168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Freeing the Input Memory"); 541761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) { 541861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) 541961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer (i,&m_inp_mem_ptr[i]); 542061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 542161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer (i,NULL); 5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer_header(); 5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer_header(); 542661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer) { 5427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(h264_scratch.pBuffer); 5428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer = NULL; 5429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 543161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_parser) { 5432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete h264_parser; 543361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser = NULL; 5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 543661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_platform_list) { 5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_platform_list); 5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = NULL; 5439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 544061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_vendor_config.pData) { 5441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_vendor_config.pData); 5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = NULL; 5443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Reset counters in mesg queues 5446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_size=0; 5447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_size=0; 5448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_size=0; 5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_read = m_ftb_q.m_write =0; 5450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_read = m_cmd_q.m_write =0; 5451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_read = m_etb_q.m_write =0; 5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 545361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 545461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.reset_ts_list(); 5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 54588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG"); 5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 546061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // NULL); 54618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Close the driver instance"); 54626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 5463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (inputBufferFile1); 5465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 54676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (outputBufferFile1) 546861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fclose (outputBufferFile1); 5469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 5471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (outputExtradataFile); 5472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 54738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec::component_deinit() complete"); 547461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 547861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 547961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseEGLImage 5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 548161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 548261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use EGL Image method implementation <TBD>. 5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 548461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 548561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 548761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 548861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Not Implemented error. 5489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 549061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 549261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 549361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 549461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 549561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN void* eglImage) 5496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 549761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list; 549861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry; 549961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info; 5500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 550261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc; 550361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan EGLint fd = -1, offset = 0,pmemPtr = 0; 5504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 550561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fd = -1, offset = 0; 5506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 55078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("use EGL image support for decoder"); 550861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) { 55098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR(""); 551061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 551261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_display_id == NULL) { 55138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Display ID is not set by IL client"); 5514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 551561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 551661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC) 551761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eglGetProcAddress("eglQueryImageKHR"); 551861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd); 551961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset); 552061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr); 5521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app 5522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl { 5523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int pmem_fd; 5524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int offset; 5525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }; 5526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl *temp_egl_id = NULL; 5527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void * pmemPtr = (void *) eglImage; 5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_egl_id = (struct temp_egl *)eglImage; 552961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_egl_id != NULL) { 5530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = temp_egl_id->pmem_fd; 5531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev offset = temp_egl_id->offset; 5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (fd < 0) { 55358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd); 5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 553761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 553861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info.pmem_fd = (OMX_U32) fd; 553961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info.offset = (OMX_U32) offset; 554061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_entry.entry = (void *) &pmem_info; 554161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 554261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list.entryList = &pmem_entry; 554361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list.nEntries = 1; 554461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers = true; 554561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port, 554661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void *)&pmem_list, drv_ctx.op_buf.buffer_size, 554761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *)pmemPtr)) { 55488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("use buffer call failed for egl image"); 554961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 555061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 555161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 555561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 555661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentRoleEnum 5557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 555861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 555961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Component Role Enum method implementation. 5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 556161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 556261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 556461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 556561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything is successful. 556661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 556861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_U8* role, 556961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 index) 5570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 557161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 5572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 557361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 557461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 557561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 55768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 557761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 557861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 557961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 558161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 558261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 558361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 55848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 558561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 558661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 558761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 558861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 558961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 559061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 55918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 559261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 55938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 559461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 559561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 559861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 559961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) ) { 560061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 560161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 56028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 560361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 560561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 560661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 560761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 560861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 560961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 56108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 561161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 561361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 561461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 561561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) { 561661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 561761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 56188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 561961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 562161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 562261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 562361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 562461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 562561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 562661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 562761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 56288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 562961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 563161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 563261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 563361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 563461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 563561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 56368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 563761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 563961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 564061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 564161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component"); 564361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 56446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 564561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 5646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 565261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 565361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateDone 5654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 565561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 565661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if entire buffer pool is allocated by IL Client or not. 565761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Need this to move to IDLE state. 5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 565961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 566061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 566261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 566361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 566561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void) 5667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 566861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 566961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet_In = false; 567061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet_Out = false; 5671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 567261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet_In = allocate_input_done(); 567361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet_Out = allocate_output_done(); 5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 567561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bRet_In && bRet_Out) { 567661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 567761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 567961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 568261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 568361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateInputDone 5684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 568561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 568661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if I/P buffer pool is allocated by IL Client or not. 5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 568861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 568961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 569261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void) 5696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 569761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 569861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0; 569961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 570061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr == NULL) { 570161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 570261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 570361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr ) { 570461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; i<drv_ctx.ip_buf.actualcount; i++) { 570561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 570661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 570761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 570861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 570961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 571061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == drv_ctx.ip_buf.actualcount) { 571161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 571261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 571361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 571461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) { 571561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated = OMX_TRUE; 571661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 571761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 572061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 572161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateOutputDone 5722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 572361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 572461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if entire O/P buffer pool is allocated by IL Client or not. 5725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 572661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 572761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 572961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 573061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 5731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 573261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void) 5734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 573561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 573661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned j=0; 573761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 573861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr == NULL) { 573961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 574061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 574261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 574361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j < drv_ctx.op_buf.actualcount; j++) { 574461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,j)) { 574561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 574661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 575061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j == drv_ctx.op_buf.actualcount) { 575161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 575261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 575361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_bEnabled) 575461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bPopulated = OMX_TRUE; 575561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 575761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 576161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 576261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseDone 5763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 576461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 576561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 576761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 576861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 577061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 577161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 577361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void) 5775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 577661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 5777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 577861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_input_done()) { 577961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 578061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 578161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 578361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 578861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 578961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseOutputDone 5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 579161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 579261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 579461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 579561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 579761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 579861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void) 5802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 580361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 580461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0,j=0; 580561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p",m_inp_mem_ptr); 580761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 580861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j < drv_ctx.op_buf.actualcount ; j++) { 580961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_out_bm_count,j)) { 581061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 581161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 581261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 581361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j == drv_ctx.op_buf.actualcount) { 581461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count = 0; 581561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 581661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 581761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 581861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count = 0; 581961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 582061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 582161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 582461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 582561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseInputDone 5826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 582761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 582861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 583161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 583461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void) 5838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 583961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 584061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0,j=0; 584161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 584361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) { 584461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j<drv_ctx.ip_buf.actualcount; j++) { 584561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( BITMASK_PRESENT(&m_inp_bm_count,j)) { 584661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 584761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 584861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 584961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j==drv_ctx.ip_buf.actualcount) { 585061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 585161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 585261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 585361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 585461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 585561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 5856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp, 585961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE * buffer) 5860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 586161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 586261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) { 58638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer); 586461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 586561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (output_flush_progress) { 586661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 586761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 586861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp = 0; 586961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 587061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 587161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 587261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 58748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 587561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer); 587661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers --; 5877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 587861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 58798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Output EOS has been reached"); 588061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!output_flush_progress) 588161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event((unsigned)NULL, (unsigned)NULL, 588261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EOS_DONE); 5883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 588461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame) { 588561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 588661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 588761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 588861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 588961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 589061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL, 589161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL); 589261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 589361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 589461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 589561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("In fill Buffer done call address %p ",buffer); 589761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_BUFFER_LOG 589861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputBufferFile1 && buffer->nFilledLen) { 589961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int buf_index = buffer - m_out_mem_ptr; 590061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int stride = drv_ctx.video_resolution.stride; 590161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int scanlines = drv_ctx.video_resolution.scan_lines; 590261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; 590361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i; 590461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bytes_written = 0; 590561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) { 590661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1); 590761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp += stride; 590861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 590961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines; 591061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int stride_c = stride; 591161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) { 591261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1); 591361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp += stride_c; 591461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 591561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 591761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 591861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* For use buffer we need to copy the data */ 591961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!output_flush_progress) { 592061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.get_next_timestamp(buffer, 592161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 592261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 592361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 592461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 592561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_TICKS expected_ts = 0; 592661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.pop_min_ts(expected_ts); 59278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list", 592861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp, expected_ts); 592961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 593061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nTimeStamp != expected_ts) { 59318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check"); 593261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 593361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 593461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 593661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_cb.FillBufferDone) { 593761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen > 0) { 593861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle_extradata(buffer); 593961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) 594061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep min timestamp interval to handle corrupted bit stream scenario 594161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(buffer->nTimeStamp); 594261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (arbitrary_bytes) 594361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan adjust_timestamp(buffer->nTimeStamp); 594461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 594561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!proc_frms) { 594661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.stop(); 594761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan latency = dec_time.processing_time_us() - latency; 594861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3); 594961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 595061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fps_metrics.start(); 595161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 595261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms++; 595361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 595461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U64 proc_time = 0; 595561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fps_metrics.stop(); 595661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_time = fps_metrics.processing_time_us(); 595761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)", 595861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms, (float)proc_time / 1e6, 595961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)(1e6 * proc_frms) / proc_time); 596061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms = 0; 596161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 596261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 596361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 596461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_EXTRADATA_LOG 596561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputExtradataFile) { 596661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 596761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 596861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) 596961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned)(buffer->pBuffer + buffer->nOffset + 597061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen + 3)&(~3)); 597161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (p_extra && 597261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) { 59738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType); 597461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fwrite (p_extra,1,p_extra->nSize,outputExtradataFile); 597561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p_extra->eType == OMX_ExtraDataNone) { 597661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 597761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 597861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 597961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 598061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 598161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 598261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 598361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 598461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 598561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 598661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 598761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 598861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 598961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((OMX_QCOM_PLATFORM_PRIVATE_LIST *) 599061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->pPlatformPrivate)->entryList->entry; 59918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd); 599261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *il_buffer; 599361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan il_buffer = client_buffers.get_il_buf_hdr(buffer); 599461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (il_buffer) 599561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,il_buffer); 599661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 599761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr"); 599861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 599961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 60008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd); 600161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 600261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 60036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 6004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 600561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp, 600961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* buffer) 6010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 601261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) { 60138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer); 601461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 60178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 601861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer, buffer->pBuffer); 6019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_input_buffers--; 6020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 602161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 602261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL && input_flush_progress == false) { 60238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer); 602461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = buffer; 602561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 602661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp = LLONG_MAX; 602761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan push_input_buffer (hComp); 602861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 60298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer); 603061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 603161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_free_q.insert_entry((unsigned)buffer, 603261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 60338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error"); 603461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 603661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_cb.EmptyBufferDone) { 6037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 603861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 6039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 6040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message) 6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 604861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec* omx = NULL; 604961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo *vdec_msg = NULL; 605061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omxhdr = NULL; 605161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer *v4l2_buf_ptr = NULL; 605261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *output_respbuf = NULL; 605361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc=1; 605461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (context == NULL || message == NULL) { 60558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check"); 605661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 605761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 605861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg = (struct vdec_msginfo *)message; 605961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 606061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = reinterpret_cast<omx_vdec*>(context); 606161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 606261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (vdec_msg->msgcode) { 606361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 606461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_HW_ERROR: 606561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 606661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 606761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 606861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 606961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_START_DONE: 607061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 607161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_START_DONE); 607261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 607361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 607461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_STOP_DONE: 607561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 607661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 607761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 607861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 607961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_RESUME_DONE: 608061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 608161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_RESUME_DONE); 608261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 608361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 608461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_PAUSE_DONE: 608561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 608661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PAUSE_DONE); 608761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 608861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 608961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 609061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 609161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 609261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 609361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 609461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 609561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 609661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 609761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_FLUSHED: 609861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 609961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 610061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* omxhdr = (OMX_BUFFERHEADERTYPE* ) 610161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.input_frame_clientdata; */ 610261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 610361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata; 610461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index; 610561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr == NULL || 610661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) { 610761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr = NULL; 610861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->status_code = VDEC_S_EFATAL; 610961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 611061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 611161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code, 611261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 611361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 611461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_INFO_FIELD_DROPPED: 611561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int64_t *timestamp; 611661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan timestamp = (int64_t *) malloc(sizeof(int64_t)); 611761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (timestamp) { 611861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *timestamp = vdec_msg->msgdata.output_frame.time_stamp; 611961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)timestamp, vdec_msg->status_code, 612061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED); 61218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Field dropped time stamp is %lld", 612261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.time_stamp); 612361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 612461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 612561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_FLUSHED: 612661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 612761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 612861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data; 612961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index; 613061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)", 613161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr, vdec_msg->msgdata.output_frame.time_stamp, 613261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.pic_type); 613361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 613461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr && omxhdr->pOutputPortPrivate && 613561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) && 613661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate 613761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) { 613861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) { 613961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len; 614061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset; 614161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp; 614261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags; 614361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 61448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) { 614561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_EOS; 614661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //rc = -1; 614761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 614861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) { 614961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 615061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 615161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.bufferaddr = 615261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr; 615361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft != 615461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.framesize.left) 615561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top) 615661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right) 615761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) { 615861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left; 615961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top; 616061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right; 616161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom; 61628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Crop information has changed"); 616361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop, 616461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PORT_RECONFIG); 616561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 616661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf = (struct vdec_output_frameinfo *)\ 616761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->pOutputPortPrivate; 616861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->len = vdec_msg->msgdata.output_frame.len; 616961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->offset = vdec_msg->msgdata.output_frame.offset; 617061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) { 617161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_I; 617261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 617361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) { 617461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_P; 617561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 617661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) { 617761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_B; 617861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 617961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 618061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->output_use_buffer) 618161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ( omxhdr->pBuffer, (void *) 618261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr + 618361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)vdec_msg->msgdata.output_frame.offset), 618461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.len); 618561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 618661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFilledLen = 0; 618761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code, 618861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_FBD); 618961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) 619061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 619161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EOS_DONE); 619261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 619361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 619461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 619561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 619661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_CONFIG_CHANGED: 61978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Port settings changed"); 619861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition, 619961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PORT_RECONFIG); 620061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 620161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_INFO_CONFIG_CHANGED: 620261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 62038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Port settings changed info"); 620461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // get_buffer_req and populate port defn structure 620561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 620661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 620761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret; 620861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 620961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 621061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height); 621161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline; 621261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.scan_lines = fmt.fmt.pix_mp.plane_fmt[0].reserved[0]; 621361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->m_port_def.nPortIndex = 1; 621461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->update_portdef(&(omx->m_port_def)); 621561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 621661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG); 621761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 621861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 621961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 622061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 622161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 622261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 6223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary ( 622661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_HANDLETYPE hComp, 622761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer 622861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 6229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 623061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 62318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Empty this arbitrary"); 623261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 623361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL) { 623461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 623561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 62368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 62378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %d, timestamp %u", 623861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp); 623961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 624061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return zero length and not an EOS buffer */ 624161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return buffer if input flush in progress */ 624261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) && 624361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) { 62448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress"); 624561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,buffer); 624661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 624761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 624861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 624961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame == NULL) { 62508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp); 625161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = buffer; 62528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Try to Push One Input Buffer "); 625361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan push_input_buffer (hComp); 625461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 62558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer); 625661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL, 625761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL)) { 625861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 625961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 626061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 626161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 626261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp) 6267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 626861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 626961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 627061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 627161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL || psource_frame == NULL) { 627261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we have a destination buffer*/ 627361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL) { 62748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get a Destination buffer from the queue"); 627561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 627661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 627761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *)address; 627861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 627961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 62808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame); 628161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 628261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 628361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 628461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we have a destination buffer*/ 628561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame == NULL) { 62868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get a source buffer from the queue"); 628761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 628861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 628961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *)address; 62908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame, 629161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nTimeStamp); 62928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d length %d", 629361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 629461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 629561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 629661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 629761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 629861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 629961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 630061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while ((pdest_frame != NULL) && (psource_frame != NULL)) { 630161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (codec_type_parse) { 630261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_MPEG4: 630361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_H263: 630461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_MPEG2: 630561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_sc_codec(hComp); 630661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 630761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_H264: 630861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_h264(hComp); 630961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 631061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_HEVC: 631161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_hevc(hComp); 631261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 631361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_VC1: 631461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_vc1(hComp); 631561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 631661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 631761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 631861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 631961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret != OMX_ErrorNone) { 63208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pushing input Buffer Failed"); 632161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 632261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 632361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 632461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 632561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 632661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 6327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp) 6330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 633161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 633261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 633361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 6334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 63358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %d", 633661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame,psource_frame->nTimeStamp); 633761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 633861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,&partial_frame) == -1) { 63398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 634061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 634261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 634361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 63448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame size %d source %p frame count %d", 634561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,psource_frame,frame_count); 634661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 634761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 63488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("TimeStamp updated %d",pdest_frame->nTimeStamp); 634961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*First Parsed buffer will have only header Hence skip*/ 635061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frame_count == 0) { 63518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame "); 635261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 635361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_MPEG4 || 635461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse == CODEC_TYPE_DIVX) { 635561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4StreamType psBits; 635661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset; 635761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.numBytes = pdest_frame->nFilledLen; 635861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4_headerparser.parseHeader(&psBits); 635961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 636061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 636161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 636261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 636361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 636461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen) { 636561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 636661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 636761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 636861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 636961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 637061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 637161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 637261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 637361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 637461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 637561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 637661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 637761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) { 63788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Zero len buffer return back to POOL"); 637961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL, 638061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL); 638161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 638261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 638361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 638461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 63858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a Complete Frame %d",pdest_frame->nFilledLen); 638661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 638761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nAllocLen == 638861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen + pdest_frame->nOffset) { 63898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled"); 639061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 639161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 639261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 639361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 639461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen == 0) { 639561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 639661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 639761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags |= psource_frame->nFlags; 63988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x", 639961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 64008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a frame size = %d number = %d", 640161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,frame_count++); 640261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 640361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 640461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 640561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 640661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 640761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 640861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 64098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr") ; 641061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 641161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 641261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 641361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd) { 64148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame); 641561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 641661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 641761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 641861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 64198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 642061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 642161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 64228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame, 642361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nTimeStamp); 64248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d length %d", 642561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 642661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 642761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 642861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 642961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp) 6433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 643461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 643661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL isNewFrame = OMX_FALSE; 643761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 643861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 643961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 64408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated"); 644161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 64438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %d " 644461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal); 64458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 644661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen && look_ahead_nal) { 644761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 644861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 644961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 6450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 6451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer,h264_scratch.nFilledLen); 6452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += h264_scratch.nFilledLen; 64538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame"); 6454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 645561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 64568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264"); 6457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 645961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 646061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length == 0) { 64618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Zero NAL, hence parse using start code"); 646261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 646361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 64648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 646761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 64688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length); 646961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_h264_nallength(psource_frame, 647061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 64718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 647261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 647461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 647661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 647761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 64788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 647961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 648061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 648161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFlags = psource_frame->nFlags; 648261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 64838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen); 648461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen) { 648561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen, 648661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NALU_TYPE_SPS); 6487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 648861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) 648961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 649061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, NALU_TYPE_SEI); 649161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 649261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // If timeinfo is present frame info from SEI is already processed 649361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 649461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, NALU_TYPE_SEI); 649561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 649661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 649761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 649861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) { 649961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_last_au_ts; 650061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_last_au_flags; 650161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef PANSCAN_HDLR 650261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 650361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->update_panscan_data(h264_last_au_ts); 650461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 650561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 650661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR || 650761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) { 650861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = h264_scratch.nTimeStamp; 650961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = h264_scratch.nFlags; 651061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 651161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 651261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts); 651361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!VALID_TS(h264_last_au_ts)) 651461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = ts_in_sei; 651561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 651661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 651761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 651861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 651961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 652061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 652161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!isNewFrame) { 652261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 652361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 65248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %d", 652561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen); 652661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 652761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 652861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 652961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ) 653061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 653161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 653261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264"); 653461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 653561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 653661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 653761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = true; 65388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x", 653961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 65408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a frame size = %d number = %d", 654161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,frame_count++); 654261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 654361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen == 0) { 65448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Copy the Current Frame since and push it"); 654561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 654661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 654761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 654861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 654961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 655061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 655161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 655261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264"); 655461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 655561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 655661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 655761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 65588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Reset the EOS Flag"); 655961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 656061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 656161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 656261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 656361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 656461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 656561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //frame_count++; 656661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 656761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 656861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 656961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 65708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame); 657161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 657261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = 0; 657361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 657461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 657561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 657661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 657761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 657861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 65798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 658061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 658161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nAllocLen == 658261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen + h264_scratch.nOffset) { 65838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 658461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 6585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 658661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 658761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 658861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!psource_frame->nFilledLen) { 65898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame); 659061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 659161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 659261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 65938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 659461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 659561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 659661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 659761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 659861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 659961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 660061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264"); 660261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 660361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 660461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 660561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 660661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%d TimeStamp = %x", 660861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 66098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++); 661061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 661161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 661261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp); 661361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!VALID_TS(pdest_frame->nTimeStamp)) 661461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = ts_in_sei; 661561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 661761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 661861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 661961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 662061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 662161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 662261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 662361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d", 662561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,h264_scratch.nFilledLen); 662661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 662761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 662861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 662961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 663061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd && !psource_frame->nFilledLen) { 663161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 663261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 663361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 66348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 663561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 663661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 66378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d src length %d", 663861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen); 663961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 664061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 664161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66446eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc) 6645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 66466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_ERRORTYPE rc = OMX_ErrorNone; 664761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) { 66486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memcpy ((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen); 66498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (pDst->nTimeStamp == LLONG_MAX) { 66506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pDst->nTimeStamp = pSrc->nTimeStamp; 66516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal DEBUG_PRINT_LOW("Assign Dst nTimeStamp=%lld", pDst->nTimeStamp); 6652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 66536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pDst->nFilledLen += pSrc->nFilledLen; 66546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pSrc->nFilledLen = 0; 665561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Destination buffer overflow"); 66576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rc = OMX_ErrorBadParameter; 6658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 66596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return rc; 6660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66626eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_hevc (OMX_HANDLETYPE hComp) 6663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 666461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 666561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 666661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL isNewFrame = OMX_FALSE; 666761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 666861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE rc = OMX_ErrorNone; 666961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 667061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 66718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated"); 667261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 66736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 667461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 667561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("h264_scratch.nFilledLen %d has look_ahead_nal %d pdest_frame nFilledLen %d nTimeStamp %lld", 667761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 667861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 667961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen && look_ahead_nal) { 668061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 668161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 668261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // copy the lookahead buffer in the scratch 66836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal rc = copy_buffer(pdest_frame, &h264_scratch); 668461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc != OMX_ErrorNone) { 668561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 668661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 668761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 668861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length == 0) { 668961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 669061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 66918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 66926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 66936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 669461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length); 669661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_h264_nallength(psource_frame, 669761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 66988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 66996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 670061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 670161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 670261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 670361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 670461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 67058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 670661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 670761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 670861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFlags = psource_frame->nFlags; 670961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen); 671161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen) { 671261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame); 671361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 671461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 671561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 671661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!isNewFrame) { 67178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %d nTimestamp %lld, pdest_frame nFilledLen %d nTimestamp %lld", 671861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 671961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 672061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone) { 672161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 672261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 672361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 672461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = true; 672561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen == 0) { 672661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 67278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer"); 672861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 672961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone ) { 673061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 673161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 673261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 673361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 673461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 673561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 673661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %d nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %d nTimeStamp %lld", 673861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 673961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 674061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 674161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 674261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 674361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 674461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 674561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 67468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pop the next pdest_buffer %p",pdest_frame); 674761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 674861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = 0; 674961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 675061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 675161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 675261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 675361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 675461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %d nTimeStamp %lld, pdest_frame nFilledLen %d nTimeStamp %lld, h264_scratch nFilledLen %d nTimeStamp %lld", 675661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 675761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 675861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 675961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nAllocLen == 676061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen + h264_scratch.nOffset) { 67618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 676261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 676361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 676461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 676561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 676661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!psource_frame->nFilledLen) { 67678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame); 676861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 676961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 677061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 67718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 677261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 677361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( rc != OMX_ErrorNone ) { 677461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 677561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 677661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 677761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 677861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%d TimeStamp = %lld", 678061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count, pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 678161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 678261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 678361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 678461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 678561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 678661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 678761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 678861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d", 679061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,h264_scratch.nFilledLen); 679161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 679261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 679361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 679461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 679561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd && !psource_frame->nFilledLen) { 679661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 679761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 679861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 679961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 680061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 68018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %d nFilledLen %d, nTimeStamp %lld", 680261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp); 680361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 680461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 680561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 68066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 68076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68086eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp) 68096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 68106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U8 *buf, *pdest; 68116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U32 partial_frame = 1; 68126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal OMX_U32 buf_len, dest_len; 68136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 681461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (first_frame == 0) { 68156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal first_frame = 1; 68168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes"); 681761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_vendor_config.pData) { 68188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Check profile type in 1st source buffer"); 68196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buf = psource_frame->pBuffer; 68206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buf_len = psource_frame->nFilledLen; 68216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) == 682361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE) { 68246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_vc1_profile = VC1_SP_MP_RCV; 682561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) { 68266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_vc1_profile = VC1_AP; 682761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer"); 68296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorStreamCorrupt; 68306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 683161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen + 68336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest_frame->nOffset; 68346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen + 683561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nOffset); 68366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 683761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dest_len < m_vendor_config.nDataSize) { 68388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Destination buffer full"); 68396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 684061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize); 68426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal pdest_frame->nFilledLen += m_vendor_config.nDataSize; 68436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 684761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (m_vc1_profile) { 68486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case VC1_AP: 68498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code"); 685061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (push_input_sc_codec(hComp) != OMX_ErrorNone) { 68518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code"); 68526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 68536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 685461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 68556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 68566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case VC1_SP_MP_RCV: 68576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal default: 68588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode"); 68596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorBadParameter; 68606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 68616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return OMX_ErrorNone; 68626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 68636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 686461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 686561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 alignment) 686661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 686761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct pmem_allocation allocation; 686861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.size = buffer_size; 686961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align = clip2(alignment); 687061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocation.align < 4096) { 687161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align = 4096; 687261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 687361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) { 68748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)", 687561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align, allocation.size); 687661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 687761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 687861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return true; 687961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 68806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 68816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size, 688261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 alignment, struct ion_allocation_data *alloc_data, 688361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_fd_data *fd_data, int flag) 68846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 688561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fd = -EINVAL; 688661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = -EINVAL; 688761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ion_dev_flag; 688861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ion ion_buf_info; 688961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!alloc_data || buffer_size <= 0 || !fd_data) { 68908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory"); 689161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -EINVAL; 689261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 689361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_dev_flag = O_RDONLY; 689461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = open (MEM_DEVICE, ion_dev_flag); 689561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 68968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd); 689761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return fd; 689861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 689961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags = 0; 690061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (flag & ION_FLAG_CACHED)) { 690161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags |= ION_FLAG_CACHED; 690261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 690361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->len = buffer_size; 690461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->align = clip2(alignment); 690561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (alloc_data->align < 4096) { 690661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->align = 4096; 690761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 690861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((secure_mode) && (flag & ION_SECURE)) 690961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->flags |= ION_SECURE; 691061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 691161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_ 6912f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan alloc_data->heap_id_mask = ION_HEAP(ION_ADSP_HEAP_ID); 691361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else 6914f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID); 691561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 691661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 6917f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID); 691861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 691961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 692061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc || !alloc_data->handle) { 69218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION ALLOC memory failed "); 692261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->handle = NULL; 692361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(fd); 692461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = -ENOMEM; 692561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return fd; 692661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 692761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd_data->handle = alloc_data->handle; 692861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd,ION_IOC_MAP,fd_data); 692961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 69308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION MAP failed "); 693161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.ion_alloc_data = *alloc_data; 693261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.ion_device_fd = fd; 693361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.fd_ion_data = *fd_data; 693461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&ion_buf_info); 693561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd_data->fd =-1; 693661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = -ENOMEM; 693761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 693861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 6940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 694261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) 6943dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{ 694461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 694561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!buf_ion_info) { 69468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata"); 694761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 694861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 694961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 695061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &buf_ion_info->ion_alloc_data.handle)) { 69518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION: free failed" ); 695261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 695361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(buf_ion_info->ion_device_fd); 695461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->ion_device_fd = -1; 695561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->ion_alloc_data.handle = NULL; 695661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->fd_ion_data.fd = -1; 6957dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand} 6958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header() 6960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 69618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("ALL output buffers are freed/released"); 696261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_use_buffer = false; 696361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers = false; 696461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 696561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 696661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_out_mem_ptr); 696761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 696861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 696961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 697061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_platform_list) { 697161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_platform_list); 697261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = NULL; 697361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 697461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 697561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 697661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_respbuffer); 697761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 697861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 697961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 698061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_outputbuffer); 698161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 698261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 6984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 69858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 698661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 6987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 6988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header() 6993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_use_buffer = false; 699561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 699661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) { 69978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free utils parser"); 699861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan delete (m_frame_parser.mutils); 699961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils = NULL; 700061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 700161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 700261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr) { 70038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input Heap Pointer"); 700461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_inp_heap_ptr); 700561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = NULL; 700661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 700761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 700861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) { 70098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input pmem header Pointer"); 701061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_phdr_pmem_ptr); 701161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = NULL; 701261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 701361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 701461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) { 70158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input pmem Pointer area"); 701661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_inp_mem_ptr); 701761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr = NULL; 701861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 701961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer) { 70208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Driver Context pointer"); 702161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_inputbuffer); 702261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer = NULL; 7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ip_buf_ion_info) { 70268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ion context"); 702761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ip_buf_ion_info); 7028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info = NULL; 7029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 70326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 70336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::stream_off(OMX_U32 port) 7034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 703561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type btype; 703661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 703761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_ports v4l2_port = OUTPUT_PORT; 703861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 703961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 704061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 704161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_port = OUTPUT_PORT; 704261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 704361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 704461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_port = CAPTURE_PORT; 704561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_ALL) { 704661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX); 704761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 704861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 704961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!rc_input) 705061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc_input; 705161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 705261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc_output; 705361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 705461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 705561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!streaming[v4l2_port]) { 705661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // already streamed off, warn and move on 705761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port," 705861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " which is already streamed off", v4l2_port); 705961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 0; 706061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 706161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 706261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port); 706361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 706461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype); 706561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 706661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 70678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port); 706861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 706961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[v4l2_port] = false; 707061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 707161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 707261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 707361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 707461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 707561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop) 707661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 707761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 707861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 707961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0; 708061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 708161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret = 0; 708261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 708361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 708461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = 1; 708561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 708661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 708761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 708861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 708961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 709061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 709161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 709261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 709361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 709461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 709561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 709661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet==OMX_ErrorNone) { 709761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 709861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 709961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 710061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 710161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 710261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 710361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 710461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 710561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount = bufreq.count; 710661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->mincount = bufreq.count; 71078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Count = %d",bufreq.count); 710861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 710961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)", 711061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type); 711161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 711261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 711361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 711461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 711561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 711661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 711761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height); 711861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 711961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes; 71208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage); 712161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 712261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 712361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 712461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 712561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 712661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 712761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 712861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 712961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = buffer_prop->buffer_size; 713061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 713161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 713261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 713361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 71348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 713561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 713661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 713761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_FRAMEINFO_EXTRADATA) { 713861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Frame info extra data enabled!"); 713961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE; 714061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 714161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_INTERLACE_EXTRADATA) { 714261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE; 714361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 714461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_PORTDEF_EXTRADATA) { 714561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE; 71468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d", 714761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size); 714861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 714961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extra_data_size) { 715061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator 715161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit 715261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 715361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size; 715461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.count = buffer_prop->actualcount; 715561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.buffer_size = extra_data_size; 715661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size += client_extra_data_size; 715761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 715861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)", 715961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type); 716061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (in_reconfig) // BufReq will be set to driver when port is disabled 716161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = buf_size; 716261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (buf_size != buffer_prop->buffer_size) { 716361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = buf_size; 716461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(buffer_prop); 716561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 716661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 71678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)", 716861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type); 716961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 717261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop) 717361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 717461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 717561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned buf_size = 0; 717661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 717761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 717861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret; 717961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)", 718061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, buffer_prop->buffer_size); 718161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 718261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_size != buffer_prop->buffer_size) { 718361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)", 718461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size, buf_size); 718561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 718661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 718761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 718861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 718961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 719061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 719161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 719261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 719361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 719461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 719561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 719661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 719761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 719861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 719961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 720061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 720161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 720261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 720361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret); 720461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 720561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 720661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 720761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 720861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = buffer_prop->actualcount; 720961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 721061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 721161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 721261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 721361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 721461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 721561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 721761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet==OMX_ErrorNone) { 721861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 721961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 722061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 722161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 722261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret); 722361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 722461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 722561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (bufreq.count < buffer_prop->actualcount) { 722661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Driver refused to change the number of buffers" 722761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " on v4l2 port %d to %d (prefers %d)", bufreq.type, 722861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, bufreq.count); 722961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 723061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 723161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.update_buffer_req()) { 723261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed"); 723361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 723461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 723561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 723661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 723761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!eRet && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 723861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // need to update extradata buffers also 723961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size; 724061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.count = buffer_prop->actualcount; 724161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 724261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7243dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand} 7244dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 7245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution() 7246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 724761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 724861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 7252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 725361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 725461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!portDefn) { 725561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 725661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 72578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("omx_vdec::update_portdef"); 725861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 725961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nSize = sizeof(portDefn); 726061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDomain = OMX_PortDomainVideo; 726161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator > 0) 726261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator / 726361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator; 726461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 72658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Divide by zero"); 726661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 7267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 726861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portDefn->nPortIndex) { 726961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirInput; 727061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 727161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 727261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 727361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused; 727461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eCompressionFormat = eCompressionFormat; 727561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bEnabled = m_inp_bEnabled; 727661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bPopulated = m_inp_bPopulated; 727761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (1 == portDefn->nPortIndex) { 727861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buf_size = 0; 727961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.update_buffer_req()) { 72808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed"); 728161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 728261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 728361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_buffer_req(buf_size)) { 72848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("update buffer requirements"); 728561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 728661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 728761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize = buf_size; 728861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirOutput; 728961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 729061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 729161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 729261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bEnabled = m_out_bEnabled; 729361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bPopulated = m_out_bPopulated; 729461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) { 72958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error in getting color format"); 729661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 729761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 729861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 729961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirMax; 730061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 730161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->nPortIndex); 730261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 730361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 730461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height; 730561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width; 730661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride = drv_ctx.video_resolution.stride; 730761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines; 730861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld" 73098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " SliceHeight = %lu", portDefn->format.video.nFrameWidth, 731061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight, 731161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride, 731261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight); 731361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers() 7318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 731961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 732061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr = NULL; 732161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; 732261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 732361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 73248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation"); 732561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nBufHdrSize = 0; 732661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformEntrySize = 0; 732761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformListSize = 0; 732861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPMEMInfoSize = 0; 732961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 733061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 733161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 733261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 73338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Setting First Output Buffer(%d)", 733461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 733561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufHdrSize = drv_ctx.op_buf.actualcount * 733661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE); 733761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 733861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize = drv_ctx.op_buf.actualcount * 733961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 734061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize = drv_ctx.op_buf.actualcount * 734161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 734261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformEntrySize = drv_ctx.op_buf.actualcount * 734361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 734461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 73458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize, 734661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE), 734761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize, 734861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize); 73498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PE %d bmSize %d",nPlatformEntrySize, 735061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count); 735161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 735261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Alloc mem for platform specific info 735361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *pPtr=NULL; 735461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 735561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize,1); 735661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \ 735761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_bufferpayload), 735861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 735961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 736061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo), 736161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 7362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 736361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \ 736461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount); 7365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 736761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 736861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_respbuffer) { 736961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr = m_out_mem_ptr; 737061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 737161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 737261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_list) + nPlatformListSize); 737361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 737461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_entry) + nPlatformEntrySize); 737561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList = m_platform_list; 737661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry = m_platform_entry; 737761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = m_pmem_info; 737861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 73798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 738061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 738161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Settting the entire storage nicely 73828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, 738361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr,pPlatformEntry); 73848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 738561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 738661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 738761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 738861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Set the values when we determine the right HxW param 738961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nAllocLen = 0; 739061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nFilledLen = 0; 739161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pAppPrivate = NULL; 739261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 739361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 739461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->entry = pPMEMInfo; 739561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform List 739661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->nEntries = 1; 739761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->entryList = pPlatformEntry; 739861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep pBuffer NULL till vdec is opened 739961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pBuffer = NULL; 740061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->offset = 0; 740161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->pmem_fd = 0; 740261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pPlatformPrivate = pPlatformList; 740361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 7404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 740561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 7406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 740761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create a mapping between buffers*/ 740861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 740961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 741061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ptr_outputbuffer[i]; 741161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the buffer and buffer header pointers 741261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr++; 741361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo++; 741461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry++; 741561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList++; 741661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 741761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 74188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 741961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr, pPtr); 742061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 742161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_out_mem_ptr); 742261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 742361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 742461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pPtr) { 742561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(pPtr); 742661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = NULL; 742761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 742861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 742961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_outputbuffer); 743061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 743161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 743261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 743361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_respbuffer); 743461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 743561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 743761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info) { 74388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 743961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 744061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = NULL; 744161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 744361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 744461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 744561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 744661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 7447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 744861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs() 7452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 745361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p1; 745461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned p2; 745561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned ident; 745661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_cmd_queue tmp_q, pending_bd_q; 745761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 745861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // pop all pending GENERATE FDB from ftb queue 745961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_ftb_q.m_size) { 746061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.pop_entry(&p1,&p2,&ident); 746161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_FBD) { 746261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.insert_entry(p1,p2,ident); 746361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 746461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.insert_entry(p1,p2,ident); 746561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 746761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //return all non GENERATE FDB to ftb queue 746861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (tmp_q.m_size) { 746961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.pop_entry(&p1,&p2,&ident); 747061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.insert_entry(p1,p2,ident); 747161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 747261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // pop all pending GENERATE EDB from etb queue 747361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_etb_q.m_size) { 747461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 747561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_EBD) { 747661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.insert_entry(p1,p2,ident); 747761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 747861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.insert_entry(p1,p2,ident); 747961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 748061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 748161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //return all non GENERATE FDB to etb queue 748261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (tmp_q.m_size) { 748361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.pop_entry(&p1,&p2,&ident); 748461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.insert_entry(p1,p2,ident); 748561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 748661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 748761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // process all pending buffer dones 748861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (pending_bd_q.m_size) { 748961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.pop_entry(&p1,&p2,&ident); 749061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (ident) { 749161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EBD: 749261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 74938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!"); 749461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 749561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 749661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 749761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 749861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FBD: 749961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 75008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!"); 750161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 750261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 750361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 750461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp) 7509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 751061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 new_frame_interval = 0; 751161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 751261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) { 751361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan new_frame_interval = (act_timestamp > prev_ts)? 751461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp - prev_ts : 751561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts - act_timestamp; 751661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (new_frame_interval < frm_int || frm_int == 0) { 751761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = new_frame_interval; 751861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frm_int) { 751961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 1e6; 752061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = frm_int; 752161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)", 752261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int, drv_ctx.frame_rate.fps_numerator / 752361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)drv_ctx.frame_rate.fps_denominator); 752461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 752561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 752661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 752761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 7528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp) 7531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 753261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rst_prev_ts && VALID_TS(act_timestamp)) { 753361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 753461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = false; 753561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (VALID_TS(prev_ts)) { 753661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool codec_cond = (drv_ctx.timestamp_adjust)? 753761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)? 753861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)): 753961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!VALID_TS(act_timestamp) || act_timestamp == prev_ts); 754061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frm_int > 0 && codec_cond) { 754161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 754261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp = prev_ts + frm_int; 754361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 754461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 754561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 754661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(act_timestamp); 754761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (frm_int > 0) // In this case the frame rate was set along 754861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { // with the port definition, start ts with 0 754961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 755061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 7551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 7555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 755661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL; 755761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_conceal_MB = 0; 755861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 frame_rate = 0; 755961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int consumed_len = 0; 756061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_MB_in_frame; 756161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 recovery_sei_flags = 1; 756261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int buf_index = p_buf_hdr - m_out_mem_ptr; 756361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_panscan_window_payload *panscan_payload = NULL; 756461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) + 756561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nOffset; 756661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.extradata_info.uaddr) { 756761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 756861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 756961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) 757061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3)); 757161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size; 757261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen)) 757361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = NULL; 757461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata; 757561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (data) { 757661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while ((consumed_len < drv_ctx.extradata_info.buffer_size) 75778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) { 757861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) { 757961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Invalid extra data size"); 758061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 758161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 758261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)data->eType) { 75838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO: 758461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_interlace_payload *payload; 758561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan payload = (struct msm_vidc_interlace_payload *)data->data; 75868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (payload->format != MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) { 758761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int enable = 1; 758861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 mbaff = 0; 758961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mbaff = (h264_parser)? (h264_parser->is_mbaff()): false; 75908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((payload->format == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) && !mbaff) 759161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 759261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 759361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 759461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) 759561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 759661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PP_PARAM_INTERLACED, (void*)&enable); 759761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 759861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) { 759961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_interlace_extradata(p_extra, payload->format); 760061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 760161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 760261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_FRAME_RATE: 760461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_framerate_payload *frame_rate_payload; 760561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data; 760661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_rate = frame_rate_payload->frame_rate; 760761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_TIMESTAMP: 760961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_ts_payload *time_stamp_payload; 761061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_payload = (struct msm_vidc_ts_payload *)data->data; 761161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo; 761261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32); 761361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB: 761561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_concealmb_payload *conceal_mb_payload; 761661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data; 761761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 761861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_height + 15)) >> 8; 761961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0); 762061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_ASPECT_RATIO: 762261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload; 762361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)data->data; 762461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((struct vdec_output_frameinfo *) 762561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width; 762661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((struct vdec_output_frameinfo *) 762761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height; 762861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI: 763061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_recoverysei_payload *recovery_sei_payload; 763161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data; 763261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan recovery_sei_flags = recovery_sei_payload->flags; 76338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) { 763461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 76358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received"); 763661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 763761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW: 763961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data; 764061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 764161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 764261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto unrecognized_extradata; 764361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 764461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan consumed_len += data->nSize; 764561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 764661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 764761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 764861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 764961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_frame_info_extradata(p_extra, 765061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate, 765161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_payload,&((struct vdec_output_frameinfo *) 765261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info); 765361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 765461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 76556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunrecognized_extradata: 765661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && client_extradata) 765761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_terminator_extradata(p_extra); 765861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 76616eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, 766261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool is_internal, bool enable) 7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 766461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 766561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 766661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state != OMX_StateLoaded) { 766761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 766861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 766961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 76708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d", 767161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata, requested_extradata, enable, is_internal); 767261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 767361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!is_internal) { 767461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enable) 767561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata |= requested_extradata; 767661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 767761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata = client_extradata & ~requested_extradata; 767861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 767961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 768061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enable) { 768161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (requested_extradata & OMX_INTERLACE_EXTRADATA) { 768261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 768361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO; 768461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 768561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set interlaced extradata." 76868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Quality of interlaced clips might be impacted."); 768761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 768861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) { 768961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 769061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE; 769161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 76928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set framerate extradata"); 769361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 769461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 769561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB; 769661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 76978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set concealed MB extradata"); 769861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 769961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 770061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI; 770161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata"); 770361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 770461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 770561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW; 770661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 770861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 770961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 77108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO; 771161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 771361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 771461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) { 771561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 771661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP; 771761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 77188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set timeinfo extradata"); 771961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 772061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 772161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 772261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = get_buffer_req(&drv_ctx.op_buf); 772361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 7724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 772861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0; 772961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *data_ptr = extra->data, data = 0; 773061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (byte_count < extra->nDataSize) { 773161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data = *data_ptr; 773261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (data) { 773361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB += (data&0x01); 773461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data >>= 1; 773561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 773661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data_ptr++; 773761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan byte_count++; 773861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 773961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 774061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_height + 15)) >> 8; 774161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0); 7742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 774661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_debug_extradata) 774761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 775061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "============== Extra Data ==============\n" 7751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Size: %lu\n" 7752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Version: %lu\n" 7753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " PortIndex: %lu\n" 7754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Type: %x\n" 77558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " DataSize: %lu", 775661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize, extra->nVersion.nVersion, 775761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex, extra->eType, extra->nDataSize); 775861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 775961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) { 776061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data; 776161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 776261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "------ Interlace Format ------\n" 7763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Size: %lu\n" 7764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Version: %lu\n" 7765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " PortIndex: %lu\n" 7766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Is Interlace Format: %d\n" 7767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Interlace Formats: %lu\n" 77688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "=========== End of Interlace ===========", 776961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex, 777061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan intfmt->bInterlaceFormat, intfmt->nInterlaceFormats); 777161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) { 777261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 777361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 777461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 777561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "-------- Frame Format --------\n" 7776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Picture Type: %d\n" 7777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Interlace Type: %d\n" 7778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Pan Scan Total Frame Num: %lu\n" 7779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Concealed Macro Blocks: %lu\n" 7780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " frame rate: %lu\n" 7781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Aspect Ratio X: %lu\n" 77828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Aspect Ratio Y: %lu", 778361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->ePicType, 778461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->interlaceType, 778561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->panScan.numWindows, 778661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->nConcealedMacroblocks, 778761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->nFrameRate, 778861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->aspectRatio.aspectRatioX, 778961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->aspectRatio.aspectRatioY); 779061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 779161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) { 779261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 779361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "------------------------------\n" 7794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Pan Scan Frame Num: %lu\n" 7795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Rectangle x: %ld\n" 7796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Rectangle y: %ld\n" 7797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Rectangle dx: %ld\n" 77988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Rectangle dy: %ld", 779961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y, 780061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy); 780161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 780261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 780361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("========= End of Frame Format =========="); 780461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra->eType == OMX_ExtraDataNone) { 780561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("========== End of Terminator ==========="); 780661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 780761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("======= End of Driver Extradata ========"); 780861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 781261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 interlaced_format_type) 7813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 781461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STREAMINTERLACEFORMAT *interlace_format; 781561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 mbaff = 0; 781661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) { 781761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 781861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 781961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE; 782061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 782161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 782261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat; 782361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT); 782461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data; 782561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT); 782661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nVersion.nVersion = OMX_SPEC_VERSION; 782761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 782861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mbaff = (h264_parser)? (h264_parser->is_mbaff()): false; 78298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) && !mbaff) { 783061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->bInterlaceFormat = OMX_FALSE; 783161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 783261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 783361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 783461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->bInterlaceFormat = OMX_TRUE; 783561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; 783661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 783761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 783861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 78416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::fill_aspect_ratio_info( 784261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_aspectratioinfo *aspect_ratio_info, 784361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info) 78446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 784561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata = frame_info; 784661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width; 784761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height; 784861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX, 784961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioY); 78506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 7851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 785361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate, 78546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct msm_vidc_panscan_window_payload *panscan_payload, 78556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct vdec_aspectratioinfo *aspect_ratio_info) 7856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 785761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL; 785861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_panscan_window *panscan_window; 785961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 78606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return; 786161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 786261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE; 786361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 786461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 786561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo; 786661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO); 786761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 786861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (picture_type) { 786961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_I: 787061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeI; 787161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 787261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_P: 787361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeP; 787461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 787561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_B: 787661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeB; 787761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 787861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 787961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0; 788061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 788161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 788261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 788361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 788461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 788561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 788661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive; 788761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio)); 788861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->nConcealedMacroblocks = num_conceal_mb; 788961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->nFrameRate = frame_rate; 789061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.numWindows = 0; 789161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (panscan_payload) { 789261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.numWindows = panscan_payload->num_panscan_windows; 789361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_window = &panscan_payload->wnd[0]; 789461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) { 789561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].x = panscan_window->panscan_window_width; 789661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].y = panscan_window->panscan_window_height; 789761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset; 789861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset; 789961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_window++; 790061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 790161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 790261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fill_aspect_ratio_info(aspect_ratio_info, frame_info); 790361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 790861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL; 790961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE; 791061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 791161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 791261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef; 791361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 791461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data; 791561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *portDefn = m_port_def; 791661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u" 79178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "sliceheight = %u",portDefn->format.video.nFrameHeight, 791861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth, 791961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nStride, 792061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nSliceHeight); 7921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra) 7924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 792561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_extradata) { 792661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 792761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 792861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE); 792961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 793061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = OMX_ExtraDataNone; 793161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = 0; 793261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->data[0] = 0; 793361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 793461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 7935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index) 7938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 793961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 794061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= drv_ctx.ip_buf.actualcount) { 79418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found"); 794261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 794361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 794461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 794561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr = (desc_buffer_hdr*) \ 794661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(desc_buffer_hdr)), 794761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 794861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 79498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed "); 795061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 795161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 795261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 795361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 795461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8)); 795561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr[index].buf_addr == NULL) { 79568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("desc buffer Allocation failed "); 795761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 795861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 795961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 796061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset) 7964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 796561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries); 796661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_demux_entries < 8192) { 796761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_offsets[m_demux_entries++] = address_offset; 796861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 796961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr) 7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 797461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 bytes_to_parse = buf_hdr->nFilledLen; 797561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset; 797661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 index = 0; 797761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 797861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 797961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 798061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (index < bytes_to_parse) { 798161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 798261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) || 798361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 798461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buf[index+2] == 0x01)) ) { 798561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Found start code, insert address offset 798661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan insert_demux_addr_offset(index); 798761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf[index+2] == 0x01) // 3 byte start code 798861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += 3; 798961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else //4 byte start code 799061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += 4; 799161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 799261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index++; 7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 799461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries); 799561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr) 7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 800061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //fix this, handle 3 byte start code, vc1 terminator entry 800161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *p_demux_data = NULL; 800261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 desc_data = 0; 800361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 start_addr = 0; 800461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 nal_size = 0; 800561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 suffix_byte = 0; 800661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 demux_index = 0; 800761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 buffer_index = 0; 800861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 800961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 801061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries."); 801161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 801261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 801361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 801461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 801561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_index > drv_ctx.ip_buf.actualcount) { 801661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index); 801761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 801861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 801961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 802061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr; 802161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 802261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( ((OMX_U8*)p_demux_data == NULL) || 802361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) { 802461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries."); 802561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 802661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 802761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; demux_index < m_demux_entries; demux_index++) { 802861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0; 802961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan start_addr = m_demux_offsets[demux_index]; 803061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) { 803161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3]; 803261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 803361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4]; 803461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 803561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (demux_index < (m_demux_entries - 1)) { 803661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2; 803761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 803861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2; 803961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 804061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)", 804161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan start_addr, 804261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte, 804361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size, 804461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan demux_index); 804561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = (start_addr >> 3) << 1; 804661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data |= (start_addr & 7) << 21; 804761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data |= suffix_byte << 24; 804861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 804961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 805061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32)); 805161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 805261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 805361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 805461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data += 16; 805561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 805661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_VC1) { 805761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("VC1 terminator entry"); 805861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0; 805961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0x82 << 24; 806061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 806161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 4, 0, sizeof(OMX_U32)); 806261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 806361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 806461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data += 16; 806561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries++; 806661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 806761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Add zero word to indicate end of descriptors 806861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data, 0, sizeof(OMX_U32)); 806961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 807061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32); 807161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size); 807261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 807361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 807461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 807561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Demux table complete!"); 807661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 8077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 80796eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf() 80806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 808161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 808261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = NULL; 808361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_members(); 808461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat = OMX_COLOR_FormatMax; 80856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 80866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 80876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client) 80886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 808961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = reinterpret_cast<omx_vdec*>(client); 80906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 80916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 809261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members() 809361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 809461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count = 0; 809561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = 0; 809661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = 0; 809761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_platform_list_client,0,sizeof(m_platform_list_client)); 809861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_platform_entry_client,0,sizeof(m_platform_entry_client)); 809961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_pmem_info_client,0,sizeof(m_pmem_info_client)); 810061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client)); 81016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 810261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(op_buf_ion_info,0,sizeof(m_platform_entry_client)); 81036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 810461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (int i = 0; i < MAX_COUNT; i++) 810561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[i] = -1; 81066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 810861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() 810961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 811061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 81116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::update_buffer_req() 81146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 811561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 811661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int src_size = 0, destination_size = 0; 811761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE drv_color_format; 811861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 81198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid client in color convert"); 812061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 812161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 812261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 81238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("No color conversion required"); 812461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 812561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 812661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 812761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 && 812861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat != OMX_COLOR_FormatYUV420Planar) { 81298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion"); 813061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 813161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto fail_update_buf_req; 813261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 813361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 813461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.open(omx->drv_ctx.video_resolution.frame_height, 813561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.frame_width, 813661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NV12_128m,YCbCr420P); 813761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) { 813861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.get_buffer_size(C2D_INPUT,src_size); 813961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) 814061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.get_buffer_size(C2D_OUTPUT,destination_size); 814161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 814261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) { 814361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size || 814461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !destination_size) { 81458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d" 814661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "driver size %d destination size %d", 814761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan src_size,omx->drv_ctx.op_buf.buffer_size,destination_size); 814861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 814961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 815061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = 0; 815161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 815261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = destination_size; 815361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size) 815461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = omx->drv_ctx.op_buf.buffer_size; 815561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 815661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 815761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 81586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 81596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_update_buf_req: 816061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 816161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 81626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 81636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 81646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::set_color_format( 816561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE dest_color_format) 81666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 816761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 816861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE drv_color_format; 816961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 81708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid client in color convert"); 817161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 817261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 817361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 817461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 817561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_color_format = (OMX_COLOR_FORMATTYPE) 817661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 817761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 81788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Incorrect color format"); 81796eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal status = false; 81806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 818161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status && (drv_color_format != dest_color_format)) { 81828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Enabling C2D"); 818361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dest_color_format != OMX_COLOR_FormatYUV420Planar) { 81848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unsupported color format for c2d"); 818561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 818661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 818761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat = OMX_COLOR_FormatYUV420Planar; 818861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled) 818961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 819061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 819161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!c2d.init()) { 81928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for c2d"); 819361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 819461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 819561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = true; 819661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 819761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 819861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled) 819961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 820061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 820161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 820261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 820361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 82046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 82066eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr() 82076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 820861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 82098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 821061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 821161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 821261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 821361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->m_out_mem_ptr; 821461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return m_out_mem_ptr_client; 82156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 821761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr 821861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd) 82196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 822061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 82218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 822261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 822361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 822461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 822561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bufadd; 822661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 822761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned index = 0; 822861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufadd - omx->m_out_mem_ptr; 822961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < omx->drv_ctx.op_buf.actualcount) { 823061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS); 823161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp; 823261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status; 823361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) { 823461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 823561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd, 823661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index], 823761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[index], pmem_baseaddress[index]); 823861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 823961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = buffer_size_req; 824061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!status) { 82418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed color conversion %d", status); 824261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = 0; 824361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return &m_out_mem_ptr_client[index]; 824461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 824561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 824661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = 0; 82476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return &m_out_mem_ptr_client[index]; 824861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 82498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr"); 825061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 82516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 825361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr 825461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd) 82556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 825661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 82578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 825861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 825961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 826061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 826161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bufadd; 826261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned index = 0; 826361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufadd - m_out_mem_ptr_client; 826461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < omx->drv_ctx.op_buf.actualcount) { 826561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return &omx->m_out_mem_ptr[index]; 826661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 82678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr"); 82686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return NULL; 82696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 827061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool omx_vdec::allocate_color_convert_buf::get_buffer_req 827161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(unsigned int &buffer_size) 82726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 827361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 827461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 827561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 827661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size = omx->drv_ctx.op_buf.buffer_size; 827761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 827861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) { 82798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get buffer size failed"); 828061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 828161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto fail_get_buffer_size; 828261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 828361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 828461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_size < omx->drv_ctx.op_buf.buffer_size) 82856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buffer_size = omx->drv_ctx.op_buf.buffer_size; 828661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 828761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 82886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_get_buffer_size: 828961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 829061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 82916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 82926eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer( 829361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufhdr) 829461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 829561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 829661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 829761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 829861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->free_output_buffer(bufhdr); 829961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled && omx->is_component_secure()) 830061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 830161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!allocated_count || !bufhdr) { 83028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr); 830361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 830461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 830561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufhdr - m_out_mem_ptr_client; 830661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= omx->drv_ctx.op_buf.actualcount) { 83078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer"); 830861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 830961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 831061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd[index] > 0) { 831161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap(pmem_baseaddress[index], buffer_size_req); 831261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd[index]); 831361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 831461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[index] = -1; 83156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 831661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->free_ion_memory(&op_buf_ion_info[index]); 8317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 831861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr[index].video_heap_ptr = NULL; 831961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocated_count > 0) 832061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count--; 832161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 832261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count = 0; 832361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!allocated_count) { 832461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 832561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 832661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_members(); 832761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 832861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 832961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->free_output_buffer(&omx->m_out_mem_ptr[index]); 83306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 8331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 83326eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 833361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes) 83346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 833561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 833661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 833761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 833861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 833961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 834061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled && omx->is_component_secure()) { 83418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d", 834261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->is_component_secure()); 834361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUnsupportedSetting; 834461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 834561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!bufferHdr || bytes > buffer_size_req) { 83468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr); 83478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("color_convert buffer_size_req %d bytes %lu", 834861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req,bytes); 834961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 835061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 835161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocated_count >= omx->drv_ctx.op_buf.actualcount) { 83528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert"); 835361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 835461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 835561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL; 835661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr, 835761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan port,appData,omx->drv_ctx.op_buf.buffer_size); 835861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone || !temp_bufferHdr) { 83598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Buffer allocation failed color_convert"); 836061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 836161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 836261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((temp_bufferHdr - omx->m_out_mem_ptr) >= 836361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.op_buf.actualcount) { 83648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid header index %d", 836561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (temp_bufferHdr - omx->m_out_mem_ptr)); 836661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUndefined; 836761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 836861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int i = allocated_count; 83696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 837061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory( 837161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req,buffer_alignment_req, 837261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data, 837361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 0); 837461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd; 837561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (op_buf_ion_info[i].ion_device_fd < 0) { 83768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert"); 837761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 837861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 837961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req, 838061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0); 838161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 838261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_baseaddress[i] == MAP_FAILED) { 83838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req); 838461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd[i]); 838561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->free_ion_memory(&op_buf_ion_info[i]); 838661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 838761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 838861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr[i].video_heap_ptr = new VideoHeap ( 838961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_buf_ion_info[i].ion_device_fd,buffer_size_req, 839061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]); 83916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 839261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get(); 839361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info_client[i].offset = 0; 839461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i]; 839561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 839661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list_client[i].nEntries = 1; 839761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list_client[i].entryList = &m_platform_entry_client[i]; 839861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pOutputPortPrivate = NULL; 839961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nAllocLen = buffer_size_req; 840061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nFilledLen = 0; 840161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nFlags = 0; 840261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 840361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE); 840461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION; 840561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i]; 840661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i]; 840761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pAppPrivate = appData; 840861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = &m_out_mem_ptr_client[i]; 84098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("IL client buffer header %p", *bufferHdr); 841061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count++; 841161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 84126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 84136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 84146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::is_component_secure() 84156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 841661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return secure_mode; 84176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 84186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 84196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format) 84206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 842161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 842261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 842361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 842461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dest_color_format = (OMX_COLOR_FORMATTYPE) 842561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 842661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 842761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 842861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 842961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ColorFormat != OMX_COLOR_FormatYUV420Planar) { 843061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 843161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 843261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dest_color_format = OMX_COLOR_FormatYUV420Planar; 843361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 843461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 84356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 8436