1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*-------------------------------------------------------------------------- 2826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCopyright (c) 2012, Code Aurora Forum. 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. 11826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * Neither the name of Code Aurora 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> 48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "omx_vdec.h" 49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <fcntl.h> 50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <limits.h> 51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_ 53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h> 54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/mman.h> 55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <cutils/properties.h> 59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef USE_EGL_IMAGE_GPU 60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <gralloc_priv.h> 64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_ICS_) 67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <genlock.h> 68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "DivXDrmDecrypt.h" 72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h> 76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h> 77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00 78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01 79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0" 83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30 84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1; 85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0"; 86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1; 89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv"; 90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile; 93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata"; 94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 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 115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion" 117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_HEAP_ID ION_CP_MM_HEAP_ID 118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extern "C"{ 121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev #include<utils/Log.h> 122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_ 124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } } 126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); } 127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input) 129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg; 131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_msginfo vdec_msg; 132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *buffer; 133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_plane plane; 134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct pollfd pfd; 135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_buffer v4l2_buf ={0}; 136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_event dqevent; 137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec *omx = reinterpret_cast<omx_vdec*>(input); 139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pfd.fd = omx->drv_ctx.video_driver_fd; 140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int error_code = 0,rc=0; 141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n"); 142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0); 143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (1) 144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = poll(&pfd, 1, TIMEOUT); 146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!rc) { 147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Poll timedout\n"); 148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else if (rc < 0) { 150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Error while polling: %d\n", rc); 151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) { 154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev v4l2_buf.memory = V4L2_MEMORY_USERPTR; 156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev v4l2_buf.length = 1; 157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev v4l2_buf.m.planes = &plane; 158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf); 159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Failed to dequeue buf: %d from capture capability\n", rc); 162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.status_code=VDEC_S_SUCCESS; 166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.msgdata.output_frame.len=plane.bytesused; 168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane.m.userptr; 169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) { 171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev v4l2_buf.memory = V4L2_MEMORY_USERPTR; 173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev v4l2_buf.m.planes = &plane; 174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf); 175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Failed to dequeue buf: %d from output capability\n", rc); 178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE; 181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.status_code=VDEC_S_SUCCESS; 182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else if (pfd.revents & POLLPRI){ 184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent); 185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(dqevent.u.data[0] == MSM_VIDC_DECODER_EVENT_CHANGE){ 186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED; 187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.status_code=VDEC_S_SUCCESS; 188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n VIDC Port Reconfig recieved \n"); 189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else if (dqevent.u.data[0] == MSM_VIDC_DECODER_FLUSH_DONE){ 190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE; 191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg.status_code=VDEC_S_SUCCESS; 192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n VIDC Flush Done Recieved \n"); 193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else 194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n VIDC Some Event recieved \n"); 195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else if (pfd.revents & POLLERR){ 196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n async_message_thread Exited \n"); 197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else{ 199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev continue; 201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (omx->async_message_process(input,&vdec_msg) < 0) { 204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n async_message_thread Exited \n"); 205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n"); 209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return NULL; 210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input) 213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec* omx = reinterpret_cast<omx_vdec*>(input); 215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned char id; 216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int n; 217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("omx_vdec: message thread start\n"); 219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0); 220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (1) 221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev n = read(omx->m_pipe_in, &id, 1); 224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(0 == n) 226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (1 == n) 231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->process_event_cb(omx, id); 233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((n < 0) && (errno != EINTR)) 235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: read from pipe failed, ret %d errno %d", n, errno); 237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n"); 241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 0; 242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id) 245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ret_value; 247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out); 248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret_value = write(omx->m_pipe_out, &id, 1); 249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value); 250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor 253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue() 254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Nothing to do 256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor 259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE); 262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert 265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id) 266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool ret = true; 268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE) 269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_q[m_write].id = id; 271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_q[m_write].param1 = p1; 272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_q[m_write].param2 = p2; 273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_write++; 274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_size ++; 275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) 276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_write = 0; 278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = false; 283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__); 284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop 289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id) 290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool ret = true; 292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_size > 0) 293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *id = m_q[m_read].id; 295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *p1 = m_q[m_read].param1; 296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *p2 = m_q[m_read].param2; 297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Move the read pointer ahead 298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ++m_read; 299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev --m_size; 300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) 301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_read = 0; 303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = false; 308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue 313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type() 314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return m_q[m_read].id; 316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list() 320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //initialize timestamps array 322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) ); 323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list() 325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //free m_ts_arr_list? 327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts) 330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool ret = true; 332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool duplicate_ts = false; 333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int idx = 0; 334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //insert at the first available empty location 336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_ts_arr_list[idx].valid) 339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //found invalid or empty entry, save timestamp 341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ts_arr_list[idx].valid = true; 342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ts_arr_list[idx].timestamp = ts; 343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ts, idx); 345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) 350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = false; 353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool ret = true; 360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int min_idx = -1; 361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_TICKS min_ts = 0; 362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int idx = 0; 363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_ts_arr_list[idx].valid) 368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //found valid entry, save index 370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (min_idx < 0) 371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //first valid entry 373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev min_ts = m_ts_arr_list[idx].timestamp; 374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev min_idx = idx; 375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (m_ts_arr_list[idx].timestamp < min_ts) 377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev min_ts = m_ts_arr_list[idx].timestamp; 379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev min_idx = idx; 380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (min_idx < 0) 386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //no valid entries found 388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ts = 0; 390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = false; 391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ts = m_ts_arr_list[min_idx].timestamp; 395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ts_arr_list[min_idx].valid = false; 396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ts, min_idx); 398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list() 406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool ret = true; 408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int idx = 0; 409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ts_arr_list[idx].valid = false; 414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances 420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void) 421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return (new omx_vdec); 423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base, 428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct ion_handle *handle, int ionMapfd) 429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd); 431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base) 434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // dup file descriptor, map once, use pmem 436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev init(dup(fd), base, size, 0 , MEM_DEVICE); 437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_ 440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::omx_vdec 443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Constructor 446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None 449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_vdec(): m_state(OMX_StateInvalid), 454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_app_data(NULL), 455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_mem_ptr(NULL), 456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr(NULL), 457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_phdr_pmem_ptr(NULL), 458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_input_buffers(0), 459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_output_buffers(0), 460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bm_count(0), 461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_bm_count(0), 462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_bPopulated(OMX_FALSE), 463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bPopulated(OMX_FALSE), 464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_flags(0), 465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_bEnabled(OMX_TRUE), 466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bEnabled(OMX_TRUE), 467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list(NULL), 468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_entry(NULL), 469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info(NULL), 470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_flush_progress (false), 471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_flush_progress (false), 472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_use_buffer (false), 473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_use_buffer (false), 474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev arbitrary_bytes (true), 475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame (NULL), 476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame (NULL), 477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr (NULL), 478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_inp_bm_count (0), 479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse ((codec_type)0), 480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev first_frame_meta (true), 481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_count (0), 482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_length(0), 483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_count (0), 484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev look_ahead_nal (false), 485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev first_frame(0), 486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev first_buffer(NULL), 487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev first_frame_size (0), 488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_error_propogated(false), 489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_device_file_ptr(NULL), 490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vc1_profile((vc1_profile_type)0), 491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts(LLONG_MAX), 492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts(true), 493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int(0), 494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_in_alloc_cnt(0), 495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_display_id(NULL), 496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ouput_egl_buffers(false), 497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser(NULL), 498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev client_extradata(0), 499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts(LLONG_MAX), 500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_flags(0), 501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_err_count(0), 502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_heap_ptr(NULL), 504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_enable_android_native_buffers(OMX_FALSE), 505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_android_native_buffers(OMX_FALSE), 506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev in_reconfig(false), 508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_output_pmem(OMX_FALSE), 509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_region_smi(OMX_FALSE), 510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_pvt_entry_pmem(OMX_FALSE), 511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev secure_mode(false) 512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ,iDivXDrmDecrypt(NULL) 514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ,m_desc_buffer_ptr(NULL) 516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ,streaming({false, false}) 517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Assumption is that , to begin with , we have all the frames with decoder */ 519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("In OMX vdec Constructor"); 520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev char property_value[PROPERTY_VALUE_MAX] = {0}; 522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_get("vidc.dec.debug.perf", property_value, "0"); 523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev perf_flag = atoi(property_value); 524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (perf_flag) 525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag); 527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.start(); 528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_frms = latency = 0; 529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_value[0] = NULL; 531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_get("vidc.dec.debug.ts", property_value, "0"); 532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_debug_timestamp = atoi(property_value); 533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp); 534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_debug_timestamp) 535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.set_timestamp_reorder_mode(true); 537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_value[0] = NULL; 540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_get("vidc.dec.debug.concealedmb", property_value, "0"); 541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_debug_concealedmb = atoi(property_value); 542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb); 543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&m_cmp,0,sizeof(m_cmp)); 546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&m_cb,0,sizeof(m_cb)); 547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset (&drv_ctx,0,sizeof(drv_ctx)); 548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE)); 549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset (m_hwdevice_name,0,sizeof(m_hwdevice_name)); 550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&op_buf_rcnfg, 0 ,sizeof(vdec_allocatorproperty)); 551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries = 0; 553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.timestamp_adjust = false; 557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_driver_fd = -1; 558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = NULL; 559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_init(&m_lock, NULL); 560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_init(&m_cmd_lock,0,0); 561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev char extradata_value[PROPERTY_VALUE_MAX] = {0}; 563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev property_get("vidc.dec.debug.extradata", extradata_value, "0"); 564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_debug_extradata = atoi(extradata_value); 565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata); 566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::~omx_vdec 574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Destructor 577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None 580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec() 585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info = NULL; 587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("In OMX vdec Destructor"); 588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_pipe_in) close(m_pipe_in); 589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_pipe_out) close(m_pipe_out); 590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pipe_in = -1; 591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pipe_out = -1; 592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_join(msg_thread_id,NULL); 594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_join(async_thread_id,NULL); 596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(drv_ctx.video_driver_fd); 597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_destroy(&m_lock); 598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_destroy(&m_cmd_lock); 599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (perf_flag) 600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME"); 602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.end(); 603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Exit OMX vdec Destructor"); 605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::OMXCntrlProcessMsgCb 610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev IL Client callbacks are generated through this routine. The decoder 613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev provides the thread context for this routine. 614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ctxt -- Context information related to the self. 617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev id -- Event identifier. This could be any of the following: 618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1. Command completion event 619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2. Buffer done callback event 620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3. Frame done callback event 621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id) 627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned p1; // Parameter - 1 629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned p2; // Parameter - 2 630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned ident; 631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned qsize=0; // qsize 632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec *pThis = (omx_vdec *) ctxt; 633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!pThis) 635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n", 637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev __func__); 638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return; 639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Protect the shared queue data structure 642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev do 643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Read the message id's from the queue*/ 645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_lock(&pThis->m_lock); 646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev qsize = pThis->m_cmd_q.m_size; 647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(qsize) 648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cmd_q.pop_entry(&p1,&p2,&ident); 650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (qsize == 0 && pThis->m_state != OMX_StatePause) 653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev qsize = pThis->m_ftb_q.m_size; 655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (qsize) 656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_ftb_q.pop_entry(&p1,&p2,&ident); 658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (qsize == 0 && pThis->m_state != OMX_StatePause) 662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev qsize = pThis->m_etb_q.m_size; 664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (qsize) 665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_etb_q.pop_entry(&p1,&p2,&ident); 667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_unlock(&pThis->m_lock); 670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*process message if we have one*/ 672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(qsize > 0) 673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev id = ident; 675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch (id) 676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_EVENT: 678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) 679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch (p1) 681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_CommandStateSet: 683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_state = (OMX_STATETYPE) p2; 684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d", 685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_state); 686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete, p1, p2, NULL); 688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_EventError: 691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(p2 == OMX_StateInvalid) 692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid"); 694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_state = (OMX_STATETYPE) p2; 695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (p2 == OMX_ErrorHardware) 699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error(); 701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventError, p2, NULL, NULL ); 706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_CommandPortDisable: 710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2); 711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (BITMASK_PRESENT(&pThis->m_flags, 712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) 713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) 718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->stream_off(); 722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->op_buf_rcnfg); 723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->in_reconfig = false; 724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eRet != OMX_ErrorNone) 725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error(); 728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete, p1, p2, NULL ); 733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_CommandPortEnable: 735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2); 736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete, p1, p2, NULL ); 738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete, p1, p2, NULL ); 743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__); 750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_ETB_ARBITRARY: 753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) 755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure"); 757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_ETB: 761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) 763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure"); 765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_FTB: 770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) 772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure"); 774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_COMMAND: 779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_U32)p2,(OMX_PTR)NULL); 781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_EBD: 784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) 786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure"); 788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) 793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_inp_err_count++; 795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->time_stamp_dts.remove_time_stamp( 796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp, 797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ?true:false); 799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_inp_err_count = 0; 803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( pThis->empty_buffer_done(&pThis->m_cmp, 805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) 806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n empty_buffer_done failure"); 808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(pThis->m_inp_err_count >= MAX_INPUT_ERROR) 811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR); 813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: 818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int64_t *timestamp = (int64_t *)p1; 820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p1) 821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->time_stamp_dts.remove_time_stamp(*timestamp, 823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ?true:false); 825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(timestamp); 826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_FBD: 830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS) 831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure"); 833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if ( pThis->fill_buffer_done(&pThis->m_cmp, 836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) 837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n fill_buffer_done failure"); 839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete"); 845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!pThis->input_flush_progress) 846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver"); 848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->execute_input_flush(); 852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) 853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS) 855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if we need generate event for Flush done*/ 862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&pThis->m_flags, 863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_INPUT_FLUSH_PENDING)) 864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client"); 867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete,OMX_CommandFlush, 869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX,NULL ); 870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (BITMASK_PRESENT(&pThis->m_flags, 872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_IDLE_PENDING)) 873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!pThis->output_flush_progress) 875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Output flush done hence issue stop"); 877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl (pThis->drv_ctx.video_driver_fd, 878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_IOCTL_CMD_STOP,NULL ) < 0*/0) 879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed"); 881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete"); 896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!pThis->output_flush_progress) 897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver"); 899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->execute_output_flush(); 903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) 904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS) 906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if we need generate event for Flush done*/ 913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&pThis->m_flags, 914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) 915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Notify Output Flush done"); 917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete,OMX_CommandFlush, 920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&pThis->m_flags, 923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) 924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Internal flush complete"); 926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR (&pThis->m_flags, 927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (BITMASK_PRESENT(&pThis->m_flags, 929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) 930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->post_event(OMX_CommandPortDisable, 932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_OUTPUT_PORT_INDEX, 933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR (&pThis->m_flags, 935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) 941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!pThis->input_flush_progress) 943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Input flush done hence issue stop"); 945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl (pThis->drv_ctx.video_driver_fd, 946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_IOCTL_CMD_STOP,NULL ) < */0) 947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed"); 949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_START_DONE: 963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE"); 964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) 966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS) 968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure"); 970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success"); 975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) 976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Move to executing"); 978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_state = OMX_StateExecuting; 981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete,OMX_CommandStateSet, 983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_StateExecuting, NULL); 984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (BITMASK_PRESENT(&pThis->m_flags, 986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_PAUSE_PENDING)) 987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl (pThis->drv_ctx.video_driver_fd, 989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) 990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed"); 992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Event Handler callback is NULL"); 1000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 1002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_PAUSE_DONE: 1004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 1005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) 1006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS) 1008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 1010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 1011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->complete_pending_buffer_done_cbs(); 1015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) 1016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 1018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //Send the callback now 1019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 1020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_state = OMX_StatePause; 1021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete,OMX_CommandStateSet, 1023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_StatePause, NULL); 1024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 1033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_RESUME_DONE: 1035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 1036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) 1037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS) 1039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 1041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 1042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) 1046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Moving the decoder to execute state"); 1048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 1049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 1050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_state = OMX_StateExecuting; 1051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete,OMX_CommandStateSet, 1053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_StateExecuting,NULL); 1054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 1063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_STOP_DONE: 1065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 1066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) 1067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p2 != VDEC_S_SUCCESS) 1069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 1071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 1072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->complete_pending_buffer_done_cbs(); 1076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) 1077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success"); 1079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 1080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 1081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_state = OMX_StateIdle; 1082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Move to Idle State"); 1083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 1084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventCmdComplete,OMX_CommandStateSet, 1085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_StateIdle,NULL); 1086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 1095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 1097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG"); 1098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->start_port_reconfig() != OMX_ErrorNone) 1099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error(); 1100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->in_reconfig) 1103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) { 1105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EventPortSettingsChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL ); 1107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 1112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1; 1114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged; 1115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 1116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev format = OMX_InterlaceInterleaveFrameTopFieldFirst; 1117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 1118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev format = OMX_InterlaceInterleaveFrameBottomFieldFirst; 1119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else //unsupported interlace format; raise a error 1120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev event = OMX_EventError; 1121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) { 1122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev event, format, 0, NULL ); 1124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 1130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_EOS_DONE: 1132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 1133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) { 1134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 1135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 1136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->prev_ts = LLONG_MAX; 1140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->rst_prev_ts = true; 1141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 1142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 1144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 1145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->omx_report_error (); 1146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 1147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG: 1148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG"); 1150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_cb.EventHandler) { 1151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL ); 1153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 1158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 1159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_lock(&pThis->m_lock); 1162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev qsize = pThis->m_cmd_q.m_size; 1163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pThis->m_state != OMX_StatePause) 1164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 1165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_unlock(&pThis->m_lock); 1166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(qsize>0); 1168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 1174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 1175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::ComponentInit 1176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 1178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Initialize the component. 1179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 1181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ctxt -- Context information related to the self. 1182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev id -- Event identifier. This could be any of the following: 1183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1. Command completion event 1184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2. Buffer done callback event 1185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3. Frame done callback event 1186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 1188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 1189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 1191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) 1192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 1195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 1196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_fmtdesc fdesc; 1197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_format fmt; 1198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_requestbuffers bufreq; 1199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int alignment = 0,buffer_size = 0; 1200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int fds[2]; 1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int r,ret=0; 1202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool codec_ambiguous = false; 1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_STRING device_name = "/dev/video32"; 1204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_driver_fd = open("/dev/video32", O_RDWR); 1206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d", 1208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_driver_fd, errno); 1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.video_driver_fd == 0){ 1211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_driver_fd = open(device_name, O_RDWR); 1212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.video_driver_fd < 0) 1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno); 1217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 1218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 1220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_denominator = 1; 1221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcpy(inputfilename, INPUT_BUFFER_FILE_NAME); 1225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 1227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev outputBufferFile1 = fopen (outputfilename, "ab"); 1228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 1230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev outputExtradataFile = fopen (ouputextradatafilename, "ab"); 1231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Copy the role information which provides the decoder kind 1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy(drv_ctx.kind,role,128); 1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\ 1236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.mpeg4",\ 1239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE); 1240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.timestamp_adjust = true; 1241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4; 1242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = OMX_VIDEO_CodingMPEG4; 1243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Initialize Start Code for MPEG4*/ 1244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_MPEG4; 1245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "m4v"); 1248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\ 1251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.mpeg2",\ 1254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE); 1255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2; 1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = OMX_VIDEO_CodingMPEG2; 1257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Initialize Start Code for MPEG2*/ 1258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_MPEG2; 1259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "mpg"); 1262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\ 1265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 1268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n H263 Decoder selected"); 1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_H263; 1270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = OMX_VIDEO_CodingH263; 1271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_H263; 1272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "263"); 1275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\ 1278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 1281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected"); 1282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3; 1283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_capability = V4L2_PIX_FMT_DIVX_311; 1284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 1285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_DIVX; 1286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ 1290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 1293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected"); 1294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4; 1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_capability = V4L2_PIX_FMT_DIVX; 1296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 1297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_DIVX; 1298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_ambiguous = true; 1299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\ 1303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected"); 1307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6; 1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_capability = V4L2_PIX_FMT_DIVX; 1309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 1310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_DIVX; 1311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_ambiguous = true; 1312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\ 1316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 1319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_H264; 1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_capability=V4L2_PIX_FMT_H264; 1321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = OMX_VIDEO_CodingAVC; 1322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_H264; 1323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_nal_length(nal_length); 1325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "264"); 1327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\ 1330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 1333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_VC1; 1334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = OMX_VIDEO_CodingWMV; 1335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_VC1; 1336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "vc1"); 1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\ 1342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE)) 1343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 1345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV; 1346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eCompressionFormat = OMX_VIDEO_CodingWMV; 1347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse = CODEC_TYPE_VC1; 1348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_start_codes (codec_type_parse); 1349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strcat(inputfilename, "vc1"); 1351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n"); 1356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInvalidComponentName; 1357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 1359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev inputBufferFile1 = fopen (inputfilename, "ab"); 1360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) 1362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.output_format = VDEC_YUV_FORMAT_TILE_4x2; 1365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev capture_capability= V4L2_PIX_FMT_NV12; 1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_event_subscription sub; 1368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sub.type=V4L2_EVENT_ALL; 1369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 1370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ret) { 1371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n Subscribe Event Failed \n"); 1372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 1373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_capability cap; 1376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap); 1377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ret) { 1378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Failed to query capabilities\n"); 1379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Capabilities: driver_name = %s, card = %s, bus_info = %s," 1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " version = %d, capabilities = %x\n", cap.driver, cap.card, 1383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev cap.bus_info, cap.version, cap.capabilities); 1384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret=0; 1386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fdesc.index=0; 1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description, 1390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fdesc.pixelformat, fdesc.flags); 1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fdesc.index++; 1392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fdesc.index=0; 1395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 1396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description, 1398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fdesc.pixelformat, fdesc.flags); 1399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fdesc.index++; 1400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_height=drv_ctx.video_resolution.scan_lines=240; 1403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width=drv_ctx.video_resolution.stride=320; 1404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 1406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 1407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.pixelformat = output_capability; 1408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ret) { 1410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 1411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Failed to set format on capture port\n"); 1412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n Set Format was successful \n "); 1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (codec_ambiguous) { 1415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (output_capability == V4L2_PIX_FMT_DIVX) { 1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_control divx_ctrl; 1417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) { 1419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4; 1420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) { 1421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5; 1422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5; 1424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev divx_ctrl.value = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT; 1427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &fmt); 1428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ret) { 1429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to set divx version\n"); 1430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Codec should not be ambiguous"); 1433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 1438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 1439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.pixelformat = output_capability; 1440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ret) { 1442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 1443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Failed to set format on capture port\n"); 1444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n Set Format was successful \n "); 1446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Get the Buffer requirements for input and output ports*/ 1448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT; 1449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 1450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.alignment=4096; 1451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.alignment=4096; 1452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.extradata = 0; 1454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.picture_order = VDEC_ORDER_DECODE; 1455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.idr_only_decoding = 0; 1456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_state = OMX_StateLoaded; 1458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet=get_buffer_req(&drv_ctx.ip_buf); 1459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size); 1460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA 1462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone && !secure_mode) 1463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(DEFAULT_EXTRADATA); 1464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 1466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.mutils == NULL) 1468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils = new H264_Utils(); 1470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.mutils == NULL) 1472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n parser utils Allocation failed "); 1474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 1475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size; 1479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size); 1480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 1481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nOffset = 0; 1482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (h264_scratch.pBuffer == NULL) 1484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed "); 1486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 1487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->initialize_frame_checking_environment(); 1489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size); 1490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser = new h264_stream_parser(); 1494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!h264_parser) 1495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!"); 1497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 1498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(pipe(fds)) 1502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("pipe creation failed\n"); 1504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 1505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int temp1[2]; 1509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(fds[0] == 0 || fds[1] == 0) 1510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pipe (temp1)) 1512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("pipe creation failed\n"); 1514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 1515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //close (fds[0]); 1517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //close (fds[1]); 1518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fds[0] = temp1 [0]; 1519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fds[1] = temp1 [1]; 1520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pipe_in = fds[0]; 1522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pipe_out = fds[1]; 1523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev r = pthread_create(&msg_thread_id,0,message_thread,this); 1524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(r < 0) 1526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed"); 1528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 1529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet != OMX_ErrorNone) 1534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Component Init Failed"); 1536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG"); 1537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 1538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NULL); 1539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Calling close() on Video Driver"); 1540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close (drv_ctx.video_driver_fd); 1541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_driver_fd = -1; 1542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success"); 1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer)); 1549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 1550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 1553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 1554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::GetComponentVersion 1555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 1557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Returns the component version. 1558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 1560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev TBD. 1561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 1563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ErrorNone. 1564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 1566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_component_version 1567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ( 1568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_HANDLETYPE hComp, 1569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OUT OMX_STRING componentName, 1570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OUT OMX_VERSIONTYPE* componentVersion, 1571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OUT OMX_VERSIONTYPE* specVersion, 1572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OUT OMX_UUIDTYPE* componentUUID 1573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 1574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 1576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n"); 1578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 1579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* TBD -- Return the proper version */ 1581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (specVersion) 1582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev specVersion->nVersion = OMX_SPEC_VERSION; 1584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 1586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 1588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 1589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::SendCommand 1590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 1592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Returns zero if all the buffers released.. 1593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 1595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 1596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 1598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 1599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 1601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp, 1602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_COMMANDTYPE cmd, 1603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 param1, 1604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR cmdData 1605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 1606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client"); 1608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 1609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n"); 1611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 1612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 1614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) 1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush " 1617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "to invalid port: %d", param1); 1618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadPortIndex; 1619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 1621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_wait(&m_cmd_lock); 1622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n send_command: Command Processed\n"); 1623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 1624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 1628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::SendCommand 1629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 1631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Returns zero if all the buffers released.. 1632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 1634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 1635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 1637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 1638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 1640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_COMMANDTYPE cmd, 1642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 param1, 1643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR cmdData 1644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 1645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 1647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_STATETYPE eState = (OMX_STATETYPE) param1; 1648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int bFlag = 1,sem_posted = 0,ret=0; 1649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd); 1651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d", 1652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_state, eState); 1653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(cmd == OMX_CommandStateSet) 1655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued"); 1657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState); 1658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /***************************/ 1659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Current State is Loaded */ 1660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /***************************/ 1661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateLoaded) 1662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eState == OMX_StateIdle) 1664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //if all buffers are allocated or all ports disabled 1666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(allocate_done() || 1667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) 1668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n"); 1670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n"); 1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 1675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Skip the event notification 1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 1677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Loaded to Loaded */ 1680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateLoaded) 1681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n"); 1683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorSameState,\ 1684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorSameState; 1686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Loaded to WaitForResources */ 1688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateWaitForResources) 1689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Since error is None , we will post an event 1691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev at the end of this function definition */ 1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n"); 1693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Loaded to Executing */ 1695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateExecuting) 1696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n"); 1698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorIncorrectStateTransition; 1701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Loaded to Pause */ 1703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StatePause) 1704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n"); 1706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorIncorrectStateTransition; 1709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Loaded to Invalid */ 1711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateInvalid) 1712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n"); 1714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 1715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInvalidState; 1716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\ 1720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eState); 1721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 1722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /***************************/ 1726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Current State is IDLE */ 1727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /***************************/ 1728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(m_state == OMX_StateIdle) 1729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eState == OMX_StateLoaded) 1731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(release_done()) 1733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* 1735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Since error is None , we will post an event at the end 1736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev of this function definition 1737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev */ 1738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n"); 1739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n"); 1743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 1744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Skip the event notification 1745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 1746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Idle to Executing */ 1749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateExecuting) 1750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 1752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 1753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 1; 1754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 1755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_state=OMX_StateExecuting; 1756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Stream On CAPTURE Was successful\n"); 1757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Idle to Idle */ 1759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateIdle) 1760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n"); 1762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorSameState,\ 1763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorSameState; 1765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Idle to WaitForResources */ 1767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateWaitForResources) 1768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n"); 1770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorIncorrectStateTransition; 1773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Idle to Pause */ 1775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StatePause) 1776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*To pause the Video core we need to start the driver*/ 1778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START, 1779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NULL) < */0) 1780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED"); 1782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_report_error (); 1783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 1784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 1788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n"); 1789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 1790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Idle to Invalid */ 1793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateInvalid) 1794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n"); 1796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 1797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInvalidState; 1798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState); 1802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 1803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /******************************/ 1807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Current State is Executing */ 1808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /******************************/ 1809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(m_state == OMX_StateExecuting) 1810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting"); 1812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Executing to Idle */ 1813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eState == OMX_StateIdle) 1814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Since error is None , we will post an event 1816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev at the end of this function definition 1817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev */ 1818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n"); 1819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 1820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!sem_posted) 1821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_posted = 1; 1823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_post (&m_cmd_lock); 1824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev execute_omx_flush(OMX_ALL); 1825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 1; 1827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc=0; 1828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev enum v4l2_buf_type btype; 1829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype); 1831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 1832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 1833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n Failed to call streamoff on OUTPUT Port \n"); 1834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev streaming[OUTPUT_PORT] = false; 1836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype); 1839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 1840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 1841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n Failed to call streamoff on CAPTURE Port \n"); 1842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 1843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev streaming[CAPTURE_PORT] = false; 1844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_event_subscription sub; 1846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sub.type=V4L2_EVENT_ALL; 1847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 1848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ret) { 1849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n Subscribe Event Failed \n"); 1850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 1851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_state == OMX_StateIdle; 1853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Executing to Paused */ 1855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StatePause) 1856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n PAUSE Command Issued"); 1858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_PAUSE, 1859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NULL) < */0) 1860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error In Pause State"); 1862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorHardware,\ 1863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 1865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 1869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Executing-->Pause\n"); 1870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 1871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Executing to Loaded */ 1874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateLoaded) 1875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n"); 1877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorIncorrectStateTransition; 1880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Executing to WaitForResources */ 1882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateWaitForResources) 1883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n"); 1885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorIncorrectStateTransition; 1888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Executing to Executing */ 1890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateExecuting) 1891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n"); 1893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorSameState,\ 1894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorSameState; 1896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Executing to Invalid */ 1898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateInvalid) 1899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n"); 1901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 1902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInvalidState; 1903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState); 1907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 1908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /***************************/ 1911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Current State is Pause */ 1912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /***************************/ 1913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(m_state == OMX_StatePause) 1914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Pause to Executing */ 1916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eState == OMX_StateExecuting) 1917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pause --> Executing \n"); 1919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_RESUME, 1920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NULL) < */0) 1921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_RESUME failed"); 1923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorHardware,\ 1924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 1926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING); 1930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 1931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event (NULL,VDEC_S_SUCCESS,\ 1932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_RESUME_DONE); 1933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 1934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Pause to Idle */ 1937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateIdle) 1938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Since error is None , we will post an event 1940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev at the end of this function definition */ 1941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pause --> Idle \n"); 1942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 1943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!sem_posted) 1944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_posted = 1; 1946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_post (&m_cmd_lock); 1947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev execute_omx_flush(OMX_ALL); 1948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 1950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Pause to loaded */ 1952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateLoaded) 1953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Pause --> loaded \n"); 1955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorIncorrectStateTransition; 1958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Pause to WaitForResources */ 1960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateWaitForResources) 1961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n"); 1963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorIncorrectStateTransition; 1966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Pause to Pause */ 1968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StatePause) 1969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Pause --> Pause \n"); 1971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorSameState,\ 1972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 1973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorSameState; 1974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from Pause to Invalid */ 1976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateInvalid) 1977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Pause --> Invalid \n"); 1979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 1980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInvalidState; 1981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 1983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState); 1985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 1986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /***************************/ 1989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Current State is WaitForResources */ 1990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /***************************/ 1991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(m_state == OMX_StateWaitForResources) 1992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from WaitForResources to Loaded */ 1994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eState == OMX_StateLoaded) 1995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 1996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Since error is None , we will post an event 1997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev at the end of this function definition */ 1998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n"); 1999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from WaitForResources to WaitForResources */ 2001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (eState == OMX_StateWaitForResources) 2002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n"); 2004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorSameState, 2005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorSameState; 2007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from WaitForResources to Executing */ 2009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateExecuting) 2010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n"); 2012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorIncorrectStateTransition; 2015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from WaitForResources to Pause */ 2017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StatePause) 2018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n"); 2020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorIncorrectStateTransition; 2023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from WaitForResources to Invalid */ 2025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(eState == OMX_StateInvalid) 2026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n"); 2028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 2029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInvalidState; 2030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Requesting transition from WaitForResources to Loaded - 2032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev is NOT tested by Khronos TS */ 2033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState); 2038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /********************************/ 2042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Current State is Invalid */ 2043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*******************************/ 2044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(m_state == OMX_StateInvalid) 2045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* State Transition from Inavlid to any state */ 2047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eState == (OMX_StateLoaded || OMX_StateWaitForResources 2048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev || OMX_StateIdle || OMX_StateExecuting 2049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev || OMX_StatePause || OMX_StateInvalid)) 2050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n"); 2052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError,OMX_ErrorInvalidState,\ 2053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInvalidState; 2055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (cmd == OMX_CommandFlush) 2058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued" 2060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "with param1: %d", param1); 2061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) 2062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 2064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) 2066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 2068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!sem_posted){ 2070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_posted = 1; 2071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Set the Semaphore"); 2072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_post (&m_cmd_lock); 2073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev execute_omx_flush(param1); 2074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 2076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if ( cmd == OMX_CommandPortEnable) 2078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued" 2080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "with param1: %d", param1); 2081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) 2082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_bEnabled = OMX_TRUE; 2084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( (m_state == OMX_StateLoaded && 2086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 2087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev || allocate_input_done()) 2088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 2090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n"); 2095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 2096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Skip the event notification 2097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 2098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) 2101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Enable output Port command recieved"); 2103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bEnabled = OMX_TRUE; 2104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( (m_state == OMX_StateLoaded && 2106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 2107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev || (allocate_output_done())) 2108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 2110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n"); 2116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 2117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Skip the event notification 2118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 2119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (cmd == OMX_CommandPortDisable) 2123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued" 2125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "with param1: %d", param1); 2126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) 2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_bEnabled = OMX_FALSE; 2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && release_input_done()) 2131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 2133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 2138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting) 2139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!sem_posted) 2141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_posted = 1; 2143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_post (&m_cmd_lock); 2144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 2146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Skip the event notification 2149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 2150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) 2153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bEnabled = OMX_FALSE; 2155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Disable output Port command recieved"); 2156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 2157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && release_output_done()) 2158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 2160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 2161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 2165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting) 2166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!sem_posted) 2168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_posted = 1; 2170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_post (&m_cmd_lock); 2171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 2173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Skip the event notification 2176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bFlag = 0; 2177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd); 2184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNotImplemented; 2185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eRet == OMX_ErrorNone && bFlag) 2187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 2189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!sem_posted) 2191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_post(&m_cmd_lock); 2193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 2199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 2200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::ExecuteOmxFlush 2201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 2203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Executes the OMX flush. 2204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 2206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev flushtype - input flush(1)/output flush(0)/ both. 2207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 2209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 2210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 2212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType) 2213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 2215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev enum vdec_bufferflush flush_dir; 2216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet = false; 2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch (flushType) 2218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_CORE_INPUT_PORT_INDEX: 2220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_flush_progress = true; 2221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev flush_dir = VDEC_FLUSH_TYPE_INPUT; 2222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_CORE_OUTPUT_PORT_INDEX: 2224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_flush_progress = true; 2225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev flush_dir = VDEC_FLUSH_TYPE_OUTPUT; 2226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 2228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_flush_progress = true; 2229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_flush_progress = true; 2230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev flush_dir = VDEC_FLUSH_TYPE_ALL; 2231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &flush_dir; 2233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 2234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_CMD_FLUSH, &ioctl_msg) < */0) 2235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", (int)flush_dir); 2237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = false; 2238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 2240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 2242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush 2243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 2245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Executes the OMX flush at OUTPUT PORT. 2246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 2248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 2249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 2251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 2252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 2253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush() 2254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned p1 = 0; // Parameter - 1 2256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned p2 = 0; // Parameter - 2 2257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned ident = 0; 2258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet = true; 2259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Generate FBD for all Buffers in the FTBq*/ 2261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_lock(&m_lock); 2262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Initiate Output Flush"); 2263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (m_ftb_q.m_size) 2264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d", 2266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_size,pending_output_buffers); 2267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.pop_entry(&p1,&p2,&ident); 2268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2); 2269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ident == OMX_COMPONENT_GENERATE_FTB ) 2270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_output_buffers++; 2272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 2273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (ident == OMX_COMPONENT_GENERATE_FBD) 2275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 2277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_unlock(&m_lock); 2280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_flush_progress = false; 2281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 2283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = LLONG_MAX; 2285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts = true; 2286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers); 2288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 2289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 2291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush 2292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 2294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Executes the OMX flush at INPUT PORT. 2295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 2297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 2298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 2300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 2301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 2302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush() 2303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i =0; 2305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned p1 = 0; // Parameter - 1 2306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned p2 = 0; // Parameter - 2 2307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned ident = 0; 2308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet = true; 2309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Generate EBD for all Buffers in the ETBq*/ 2311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Initiate Input Flush \n"); 2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_lock(&m_lock); 2314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Check if the Queue is empty \n"); 2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (m_etb_q.m_size) 2316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.pop_entry(&p1,&p2,&ident); 2318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) 2320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 2322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 2323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(ident == OMX_COMPONENT_GENERATE_ETB) 2325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_input_buffers++; 2327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 2328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 2329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 2330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (ident == OMX_COMPONENT_GENERATE_EBD) 2332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p", 2334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_BUFFERHEADERTYPE *)p1); 2335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 2336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.flush_timestamp(); 2339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if Heap Buffers are to be flushed*/ 2340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 2341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Reset all the variables before flusing"); 2343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 2344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_count = 0; 2345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev look_ahead_nal = false; 2346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_count = 0; 2347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts = LLONG_MAX; 2348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_flags = 0; 2349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 2350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries = 0; 2351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Initialize parser"); 2352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.mutils) 2353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->initialize_frame_checking_environment(); 2355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (m_input_pending_q.m_size) 2358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_pending_q.pop_entry(&p1,&p2,&ident); 2360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1); 2361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (psource_frame) 2364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame); 2366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame = NULL; 2367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pdest_frame) 2370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen = 0; 2372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL); 2373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = NULL; 2374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.flush(); 2376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_unlock(&m_lock); 2378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_flush_progress = false; 2379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!arbitrary_bytes) 2380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = LLONG_MAX; 2382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts = true; 2383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 2385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_debug_timestamp) 2386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_timestamp_list.reset_ts_list(); 2388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers); 2391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 2392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 2396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 2397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::SendCommandEvent 2398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 2400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Send the event to decoder pipe. This is needed to generate the callbacks 2401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev in decoder thread context. 2402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 2404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 2405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 2407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 2408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 2410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1, 2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int p2, 2412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int id) 2413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet = false; 2415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_lock(&m_lock); 2418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (id == OMX_COMPONENT_GENERATE_FTB || 2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev id == OMX_COMPONENT_GENERATE_FBD) 2421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.insert_entry(p1,p2,id); 2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (id == OMX_COMPONENT_GENERATE_ETB || 2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev id == OMX_COMPONENT_GENERATE_EBD || 2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) 2427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.insert_entry(p1,p2,id); 2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.insert_entry(p1,p2,id); 2433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = true; 2436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this); 2437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_message(this, id); 2438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_unlock(&m_lock); 2440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 2442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 2445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!profileLevelType) 2448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(profileLevelType->nPortIndex == 0) { 2451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) 2452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 2456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 2457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (profileLevelType->nProfileIndex == 1) 2460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 2462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 2463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(profileLevelType->nProfileIndex == 2) 2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 2467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 2468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", 2472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->nProfileIndex); 2473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) 2477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 2481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_H263Level70; 2482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex); 2486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) 2490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 2494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 2495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(profileLevelType->nProfileIndex == 1) 2497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 2499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 2500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex); 2504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) 2508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (profileLevelType->nProfileIndex == 0) 2510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple; 2512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 2513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(profileLevelType->nProfileIndex == 1) 2515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain; 2517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 2518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex); 2522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex); 2529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 2530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 2535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 2536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::GetParameter 2537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 2539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Get Parameter method implementation 2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 2542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 2543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Error None if successful. 2546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 2548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 2549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_INDEXTYPE paramIndex, 2550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INOUT OMX_PTR paramData) 2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: \n"); 2555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 2556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Get Param in Invalid State\n"); 2558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(paramData == NULL) 2561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Get Param in Invalid paramData \n"); 2563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch(paramIndex) 2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamPortDefinition: 2568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 2570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 2571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n"); 2572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = update_portdef(portDefn); 2573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) 2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_port_def = *portDefn; 2575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoInit: 2578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PORT_PARAM_TYPE *portParamType = 2580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_PORT_PARAM_TYPE *) paramData; 2581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n"); 2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 2584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portParamType->nSize = sizeof(portParamType); 2585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portParamType->nPorts = 2; 2586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portParamType->nStartPortNumber = 0; 2587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoPortFormat: 2590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 2592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 2593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n"); 2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->nSize = sizeof(portFmt); 2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (0 == portFmt->nPortIndex) 2599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (0 == portFmt->nIndex) 2601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->eColorFormat = OMX_COLOR_FormatUnused; 2603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->eCompressionFormat = eCompressionFormat; 2604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 2608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " NoMore compression formats\n"); 2609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (1 == portFmt->nPortIndex) 2613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(0 == portFmt->nIndex) 2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE) 2618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka; 2619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 2622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " NoMore Color formats\n"); 2623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 2624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 2626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n", 2630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (int)portFmt->nPortIndex); 2631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 2632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Component should support this port definition*/ 2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamAudioInit: 2637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PORT_PARAM_TYPE *audioPortParamType = 2639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_PORT_PARAM_TYPE *) paramData; 2640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n"); 2641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev audioPortParamType->nSize = sizeof(audioPortParamType); 2643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev audioPortParamType->nPorts = 0; 2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev audioPortParamType->nStartPortNumber = 0; 2645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Component should support this port definition*/ 2648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamImageInit: 2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PORT_PARAM_TYPE *imagePortParamType = 2651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_PORT_PARAM_TYPE *) paramData; 2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n"); 2653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 2654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev imagePortParamType->nSize = sizeof(imagePortParamType); 2655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev imagePortParamType->nPorts = 0; 2656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev imagePortParamType->nStartPortNumber = 0; 2657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Component should support this port definition*/ 2661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamOtherInit: 2662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n", 2664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet =OMX_ErrorUnsupportedIndex; 2666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamStandardComponentRole: 2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PARAM_COMPONENTROLETYPE *comp_role; 2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev comp_role->nSize = sizeof(*comp_role); 2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n", 2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 2678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_MAX_STRINGNAME_SIZE); 2679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Added for parameter test */ 2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamPriorityMgmt: 2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PRIORITYMGMTTYPE *priorityMgmType = 2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_PRIORITYMGMTTYPE *) paramData; 2687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n"); 2688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 2689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev priorityMgmType->nSize = sizeof(priorityMgmType); 2690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Added for parameter test */ 2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamCompBufferSupplier: 2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n"); 2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufferSupplierType->nSize = sizeof(bufferSupplierType); 2701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 2702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(0 == bufferSupplierType->nPortIndex) 2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (1 == bufferSupplierType->nPortIndex) 2705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 2706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoAvc: 2713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n", 2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 2716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoH263: 2719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n", 2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 2722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoMpeg4: 2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n", 2727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 2728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoMpeg2: 2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n", 2733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 2734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoProfileLevelQuerySupported: 2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex); 2739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType = 2740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData; 2741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = get_supported_profile_level_for_1080p(profileLevelType); 2742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 2745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: 2746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n"); 2748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 2749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 2750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(secure_mode) { 2752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED | 2753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev GRALLOC_USAGE_PRIVATE_UNCACHED); 2754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 2755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 2756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 2758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n"); 2759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 2766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex); 2768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet =OMX_ErrorUnsupportedIndex; 2769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n", 2774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width, 2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_height, 2776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.stride, 2777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.scan_lines); 2778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 2783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 2784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 2786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 2788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((params == NULL) || 2790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (params->nativeBuffer == NULL) || 2791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (params->nativeBuffer->handle == NULL) || 2792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !m_enable_android_native_buffers) 2793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_android_native_buffers = OMX_TRUE; 2795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sp<android_native_buffer_t> nBuf = params->nativeBuffer; 2796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private_handle_t *handle = (private_handle_t *)nBuf->handle; 2797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 2798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buffer = NULL; 2799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) { 2800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = (OMX_U8*)mmap(0, handle->size, 2801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 2802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(buffer == MAP_FAILED) { 2803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 2804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 2805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 2808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 2809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 2812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 2815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 2816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::Setparameter 2817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 2819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Set Parameter method implementation. 2820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 2822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 2823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 2825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if successful. 2826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 2828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 2829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_INDEXTYPE paramIndex, 2830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR paramData) 2831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 2833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 2834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 2836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Set Param in Invalid State\n"); 2838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(paramData == NULL) 2841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n"); 2843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 2844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((m_state != OMX_StateLoaded) && 2846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 2847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (m_out_bEnabled == OMX_TRUE) && 2848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 2849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (m_inp_bEnabled == OMX_TRUE)) { 2850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Set Param in Invalid State \n"); 2851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 2852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch(paramIndex) 2854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamPortDefinition: 2856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 2858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 2859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has 2860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //been called. 2861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n", 2862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (int)portDefn->format.video.nFrameHeight, 2863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (int)portDefn->format.video.nFrameWidth); 2864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(OMX_DirOutput == portDefn->eDir) 2865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n"); 2867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_display_id = portDefn->format.video.pNativeWindow; 2868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount && 2869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size ) 2870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual; 2872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size = portDefn->nBufferSize; 2873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = set_buffer_req(&drv_ctx.op_buf); 2874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) 2875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_port_def = *portDefn; 2876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%d: %u)\n", 2880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size, 2881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountActual, portDefn->nBufferSize); 2882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(OMX_DirInput == portDefn->eDir) 2886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((portDefn->format.video.xFramerate >> 16) > 0 && 2888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) 2889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Frame rate only should be set if this is a "known value" or to 2891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // activate ts prediction logic (arbitrary mode only) sending input 2892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // timestamps with max value (LLONG_MAX). 2893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %d", 2894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.xFramerate >> 16); 2895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 2896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_denominator); 2897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!drv_ctx.frame_rate.fps_numerator) 2898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 2900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator = 30; 2901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.frame_rate.fps_denominator) 2903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator = (int) 2904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 2905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_denominator = 1; 2906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator; 2908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.frame_rate; 2909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE, 2910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < */0) 2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setting frame rate to driver failed"); 2913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", 2915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int, drv_ctx.frame_rate.fps_numerator / 2916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (float)drv_ctx.frame_rate.fps_denominator); 2917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n"); 2919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.video_resolution.frame_height != 2920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameHeight || 2921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width != 2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth) 2923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n", 2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth, 2926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameHeight); 2927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (portDefn->format.video.nFrameHeight != 0x0 && 2928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth != 0x0) 2929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_height = 2931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.scan_lines = 2932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameHeight; 2933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width = 2934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.stride = 2935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth; 2936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.video_resolution; 2937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 2938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES, 2939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < */0) 2940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Set Resolution failed"); 2942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = get_buffer_req(&drv_ctx.op_buf); 2946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 2949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && portDefn->nBufferSize == drv_ctx.ip_buf.buffer_size) 2950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 2952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize; 2953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = set_buffer_req(&drv_ctx.ip_buf); 2954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\n", 2958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size, 2959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountActual, portDefn->nBufferSize); 2960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (portDefn->eDir == OMX_DirMax) 2964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 2966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (int)portDefn->nPortIndex); 2967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 2968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 2971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoPortFormat: 2972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 2974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 2975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ret=0; 2976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_format fmt; 2977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n", 2978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->eColorFormat); 2979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(1 == portFmt->nPortIndex) 2981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 2983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 2984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 2985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.pixelformat = capture_capability; 2986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev enum vdec_output_fromat op_format; 2987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) 2988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev op_format = VDEC_YUV_FORMAT_NV12; 2989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(portFmt->eColorFormat == 2990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka) 2991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev op_format = VDEC_YUV_FORMAT_TILE_4x2; 2992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 2993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eRet == OMX_ErrorNone) 2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 2997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.output_format = op_format; 2998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 2999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ret) 3000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Set output format failed"); 3002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 3004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = get_buffer_req(&drv_ctx.op_buf); 3008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexPortDefn: 3015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt = 3017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData; 3018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n", 3019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->nFramePackingFormat); 3020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Input port */ 3022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (portFmt->nPortIndex == 0) 3023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) 3025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(secure_mode) { 3027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev arbitrary_bytes = false; 3028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session"); 3029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 3031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev arbitrary_bytes = true; 3032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (portFmt->nFramePackingFormat == 3035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_FramePacking_OnlyOneCompleteFrame) 3036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev arbitrary_bytes = false; 3038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %d\n", 3042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->nFramePackingFormat); 3043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) 3047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n"); 3049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid && 3050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->nMemRegion < OMX_QCOM_MemRegionMax) && 3051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) 3052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_region_smi = OMX_TRUE; 3054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) 3055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n"); 3057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_output_pmem = OMX_TRUE; 3058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamStandardComponentRole: 3065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PARAM_COMPONENTROLETYPE *comp_role; 3067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 3068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n", 3069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev comp_role->cRole); 3070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((m_state == OMX_StateLoaded)&& 3072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 3073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Set Parameter called in valid state"); 3075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n"); 3079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 3080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) 3083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) 3085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 3087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet =OMX_ErrorUnsupportedSetting; 3092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) 3095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) 3097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 3099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) 3107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) 3109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 3111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet =OMX_ErrorUnsupportedSetting; 3116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) 3119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) 3121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 3123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 3131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) 3132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 3133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) 3135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 3137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet =OMX_ErrorUnsupportedSetting; 3142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 3145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 3146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 3147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) 3149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 3151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet =OMX_ErrorUnsupportedSetting; 3156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind); 3161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInvalidComponentName; 3162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamPriorityMgmt: 3167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state != OMX_StateLoaded) 3169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n"); 3171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 3172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 3174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n", 3175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev priorityMgmtype->nGroupID); 3176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n", 3178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev priorityMgmtype->nGroupPriority); 3179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 3181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 3182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamCompBufferSupplier: 3187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 3189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n", 3190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufferSupplierType->eBufferSupplier); 3191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 3192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 3193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 3197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoAvc: 3202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n", 3204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 3205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoH263: 3208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n", 3210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 3211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoMpeg4: 3214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n", 3216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 3217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_IndexParamVideoMpeg2: 3220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n", 3222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev paramIndex); 3223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamVideoDecoderPictureOrder: 3226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder = 3228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData; 3229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY; 3230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n", 3231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pictureOrder->eOutputPictureOrder); 3232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) 3233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pic_order = VDEC_ORDER_DISPLAY; 3234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){ 3235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pic_order = VDEC_ORDER_DECODE; 3236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.set_timestamp_reorder_mode(false); 3237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 3240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order) 3242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.picture_order = pic_order; 3244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // ioctl_msg.in = &drv_ctx.picture_order; 3245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //ioctl_msg.out = NULL; 3246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER, 3247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < */0) 3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Set picture order failed"); 3250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamConcealMBMapExtraData: 3256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) 3257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, 3258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((QOMX_ENABLETYPE *)paramData)->bEnable); 3259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 3261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamFrameInfoExtraData: 3265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) 3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, 3268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((QOMX_ENABLETYPE *)paramData)->bEnable); 3269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 3271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamInterlaceExtraData: 3276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) 3277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, 3278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((QOMX_ENABLETYPE *)paramData)->bEnable); 3279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 3281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamH264TimeInfo: 3285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) 3286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, 3287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((QOMX_ENABLETYPE *)paramData)->bEnable); 3288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n secure mode setting not supported"); 3290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamVideoDivx: 3294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData; 3296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 0 3298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev createDivxDrmContext( divXType->pDrmHandle ); 3299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexPlatformPvt: 3303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n"); 3305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData; 3306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) 3307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type); 3309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_pvt_entry_pmem = OMX_TRUE; 3314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) 3315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n"); 3317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_output_pmem = OMX_TRUE; 3318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamVideoSyncFrameDecodingMode: 3324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 3326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode"); 3327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.idr_only_decoding = 1; 3328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc; //= ioctl(drv_ctx.video_driver_fd, 3329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // VDEC_IOCTL_SET_IDR_ONLY_DECODING); 3330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(rc < 0) { 3331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver."); 3332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 3333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamIndexExtraDataType: 3338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) { 3340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData; 3341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) && 3342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (extradataIndexType->bEnabled == OMX_TRUE) && 3343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (extradataIndexType->nPortIndex == 1)) 3344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n"); 3346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled); 3347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Set smooth streaming parameter 3348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc;// = ioctl(drv_ctx.video_driver_fd, 3349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // VDEC_IOCTL_SET_CONT_ON_RECONFIG); 3350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(rc < 0) { 3351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver."); 3352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 3353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 3360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Need to allow following two set_parameters even in Idle 3361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * state. This is ANDROID architecture which is not in sync 3362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * with openmax standard. */ 3363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: 3364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 3366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(enableNativeBuffers) { 3367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_enable_android_native_buffers = enableNativeBuffers->enable; 3368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: 3372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = use_android_native_buffer(hComp, paramData); 3374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexParamEnableTimeStampReorder: 3378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData; 3380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.picture_order == QOMX_VIDEO_DISPLAY_ORDER) { 3381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (reorder->bEnable == OMX_TRUE) { 3382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int =0; 3383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.set_timestamp_reorder_mode(true); 3384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.set_timestamp_reorder_mode(false); 3387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 3388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.set_timestamp_reorder_mode(false); 3389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (reorder->bEnable == OMX_TRUE) 3390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedSetting; 3392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 3397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex); 3399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorUnsupportedIndex; 3400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 3403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 3406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 3407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::GetConfig 3408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 3410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Get Config Method implementation. 3411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 3413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 3414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 3416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if successful. 3417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 3419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp, 3420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_INDEXTYPE configIndex, 3421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INOUT OMX_PTR configData) 3422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 3424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_state == OMX_StateInvalid) 3426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Get Config in Invalid State\n"); 3428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 3429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch (configIndex) 3432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexConfigInterlaced: 3434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_CONFIG_INTERLACETYPE *configFmt = 3436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_QCOM_CONFIG_INTERLACETYPE *) configData; 3437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (configFmt->nPortIndex == 1) 3438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (configFmt->nIndex == 0) 3440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive; 3442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (configFmt->nIndex == 1) 3444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev configFmt->eInterlaceType = 3446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 3447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (configFmt->nIndex == 2) 3449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev configFmt->eInterlaceType = 3451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 3452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:" 3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " NoMore Interlaced formats\n"); 3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 3458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n", 3464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (int)configFmt->nPortIndex); 3465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexQueryNumberOfVideoDecInstance: 3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 3472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances = 3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData; 3474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances; 3475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //(void)(ioctl(drv_ctx.video_driver_fd, 3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg)); 3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev decoderinstances->nNumOfInstances = 16; 3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_QcomIndexConfigVideoFramePackingArrangement: 3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt = 3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData; 3488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->get_frame_pack_data(configFmt); 3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs"); 3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex); 3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 3500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 3505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::SetConfig 3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Set Config method implementation 3513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 3516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if successful. 3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 3520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp, 3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_INDEXTYPE configIndex, 3522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR configData) 3523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Get Config in Invalid State\n"); 3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 3528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE ret = OMX_ErrorNone; 3531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_VIDEO_CONFIG_NALSIZE *pNal; 3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Set Config Called"); 3534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_state == OMX_StateExecuting) 3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n"); 3538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (configIndex == OMX_IndexVendorVideoExtraData) 3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData; 3544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called"); 3545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) 3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC"); 3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 extra_size; 3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Parsing done here for the AVC atom is definitely not generic 3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Currently this piece of code is working, but certainly 3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // not tested with all .mp4 files. 3552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Incase of failure, we might need to revisit this 3553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // for a generic piece of code. 3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Retrieve size of NAL length field 3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // byte #4 contains the size of NAL lenght field 3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_length = (config->pData[4] & 0x03) + 1; 3558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_size = 0; 3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (nal_length > 2) 3561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Presently we assume that only one SPS and one PPS in AvC1 Atom */ 3563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_size = (nal_length - 2) * 2; 3564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // SPS starts from byte #6 3567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]); 3568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *pDestBuf; 3569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 3570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // minus 6 --> SPS starts from byte #6 3572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // minus 1 --> picture param set byte to be ignored from avcatom 3573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size; 3574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize); 3575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 len; 3576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 index = 0; 3577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // case where SPS+PPS is sent as part of set_config 3578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pDestBuf = m_vendor_config.pData; 3579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n", 3581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex, 3582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize, 3583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData); 3584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (index < 2) 3585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev uint8 *psize; 3587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev len = *pSrcBuf; 3588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev len = len << 8; 3589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev len |= *(pSrcBuf + 1); 3590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psize = (uint8 *) & len; 3591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(pDestBuf + nal_length, pSrcBuf + 2,len); 3592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (int i = 0; i < nal_length; i++) 3593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pDestBuf[i] = psize[nal_length - 1 - i]; 3595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //memcpy(pDestBuf,pSrcBuf,(len+2)); 3597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pDestBuf += len + nal_length; 3598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pSrcBuf += len + 2; 3599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev index++; 3600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pSrcBuf++; // skip picture param set 3601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev len = 0; 3602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") || 3605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) 3606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 3608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize = config->nDataSize; 3609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize)); 3610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(m_vendor_config.pData, config->pData,config->nDataSize); 3611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) 3613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_vendor_config.pData) 3615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_vendor_config.pData); 3617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = NULL; 3618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize = 0; 3619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (((*((OMX_U32 *) config->pData)) & 3622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VC1_SP_MP_START_CODE_MASK) == 3623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VC1_SP_MP_START_CODE) 3624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n"); 3626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 3627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize = config->nDataSize; 3628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = 3629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_U8 *) malloc(config->nDataSize); 3630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(m_vendor_config.pData, config->pData, 3631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev config->nDataSize); 3632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vc1_profile = VC1_SP_MP_RCV; 3633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) 3635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n"); 3637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 3638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize = config->nDataSize; 3639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = 3640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_U8 *) malloc((config->nDataSize)); 3641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(m_vendor_config.pData, config->pData, 3642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev config->nDataSize); 3643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vc1_profile = VC1_AP; 3644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if ((config->nDataSize == VC1_STRUCT_C_LEN)) 3646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n"); 3648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nPortIndex = config->nPortIndex; 3649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.nDataSize = config->nDataSize; 3650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize); 3651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(m_vendor_config.pData,config->pData,config->nDataSize); 3652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vc1_profile = VC1_SP_MP_RCV; 3653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 3655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n"); 3657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 3660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (configIndex == OMX_IndexConfigVideoNalSize) 3662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData); 3665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_length = pNal->nNaluBytes; 3666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.init_nal_length(nal_length); 3667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length); 3668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 3669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNotImplemented; 3672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 3675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 3676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::GetExtensionIndex 3677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 3679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX GetExtensionIndex method implementaion. <TBD> 3680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 3682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 3683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 3685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if everything successful. 3686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 3688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 3689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_STRING paramName, 3690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OUT OMX_INDEXTYPE* indexType) 3691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 3693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n"); 3695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 3696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) { 3698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode; 3699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) 3701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType; 3703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 3705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) { 3706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 3707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) { 3709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 3710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) { 3712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName); 3713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 3714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) { 3716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 3717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName); 3721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNotImplemented; 3722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 3724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 3727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 3728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::GetState 3729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 3731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Returns the state information back to the caller.<TBD> 3732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 3734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 3735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 3737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Error None if everything is successful. 3738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 3739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp, 3740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OUT OMX_STATETYPE* state) 3741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *state = m_state; 3743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state); 3744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 3745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 3748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 3749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::ComponentTunnelRequest 3750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 3752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Component Tunnel Request method implementation. <TBD> 3753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 3755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 3756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 3758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if everything successful. 3759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 3761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 3762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 port, 3763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_HANDLETYPE peerComponent, 3764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 peerPort, 3765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 3766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n"); 3768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNotImplemented; 3769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 3772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 3773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::UseOutputBuffer 3774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 3776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Helper function for Use buffer in the input pin 3777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 3779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 3780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 3782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 3783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 3785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_output_buffer( 3786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_HANDLETYPE hComp, 3787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 3788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 port, 3789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR appData, 3790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 bytes, 3791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U8* buffer) 3792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 3794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 3795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i= 0; // Temporary counter 3796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 3797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_setbuffer_cmd setbuffers; 3798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PTR privateAppData = NULL; 3799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private_handle_t *handle = NULL; 3800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buff = buffer; 3801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_out_mem_ptr) { 3802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers"); 3803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = allocate_output_headers(); 3804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) { 3807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i< drv_ctx.op_buf.actualcount; i++) { 3808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_ABSENT(&m_out_bm_count,i)) 3809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 3811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(i >= drv_ctx.op_buf.actualcount) { 3816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 3817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) { 3820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 3821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_enable_android_native_buffers) { 3822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_use_android_native_buffers) { 3823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 3824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sp<android_native_buffer_t> nBuf = params->nativeBuffer; 3825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev handle = (private_handle_t *)nBuf->handle; 3826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev privateAppData = params->pAppPrivate; 3827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev handle = (private_handle_t *)buff; 3830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) { 3831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buff = (OMX_U8*)mmap(0, handle->size, 3832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 3833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buff == MAP_FAILED) { 3834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 3835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 3836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev privateAppData = appData; 3839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined(_ANDROID_ICS_) 3841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev native_buffer[i].nativehandle = handle; 3842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!handle) { 3844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 3845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 3846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 3848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].offset = 0; 3849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 3850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].mmaped_size = 3851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 3852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else 3853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!ouput_egl_buffers && !m_use_output_pmem) { 3856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 3857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 3858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 3859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 3860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.op_buf_ion_info[i].fd_ion_data, 0); 3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 3862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 3863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 3865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 3866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 3867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 3868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev open (MEM_DEVICE,O_RDWR); 3869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 3871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 3872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) 3875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 3877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev open (MEM_DEVICE,O_RDWR); 3878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 3879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 3880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 3884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size, 3885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.alignment)) 3886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 3887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed"); 3888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 3889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode) { 3893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr = 3894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 3895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, 3896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 3897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 3898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 3899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 3900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 3901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 3903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].offset = 0; 3906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev privateAppData = appData; 3907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 3909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem); 3911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!appData || !bytes ) { 3912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode && !buffer) { 3913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case"); 3914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 3915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 3919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 3920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 3921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!pmem_list->entryList || !pmem_list->entryList->entry || 3922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !pmem_list->nEntries || 3923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 3924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer"); 3925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 3926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 3928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_list->entryList->entry; 3929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x", 3930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_info->pmem_fd); 3931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 3932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 3933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 3934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].mmaped_size = 3935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 3936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev privateAppData = appData; 3937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 3939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd; 3940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *bufferHdr = (m_out_mem_ptr + i ); 3942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(secure_mode) 3943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 3944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 3945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 3946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof (vdec_bufferpayload)); 3947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // ioctl_msg.in = &setbuffers; 3949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // ioctl_msg.out = NULL; 3950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i, 3952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd ); 3953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER, 3954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // &ioctl_msg) < 0) 3955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // { 3956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // DEBUG_PRINT_ERROR("\n Set output buffer failed"); 3957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // return OMX_ErrorInsufficientResources; 3958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // } 3959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // found an empty buffer at i 3960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 3961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->pBuffer = buff; 3962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->pAppPrivate = privateAppData; 3963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_out_bm_count,i); 3964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 3966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 3969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 3970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::use_input_heap_buffers 3971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 3973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Use Buffer Heap allocation method implementation. 3974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 3976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 3977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 3979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None , if everything successful. 3980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 3982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_input_heap_buffers( 3983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_HANDLETYPE hComp, 3984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 3985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 port, 3986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR appData, 3987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 bytes, 3988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U8* buffer) 3989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer); 3991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 3992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_inp_heap_ptr) 3993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 3994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 3995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount); 3996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_phdr_pmem_ptr) 3997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 3998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 3999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount); 4000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_inp_heap_ptr || !m_phdr_pmem_ptr) 4001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Insufficent memory"); 4003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 4004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) 4006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_use_buffer = true; 4008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 4009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 4010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 4011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 4012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 4013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 4014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], NULL, NULL)) 4018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Free_q is full"); 4020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_in_alloc_cnt++; 4023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("All i/p buffers have been set!"); 4027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 4028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 4033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 4034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::UseBuffer 4035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 4037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Use Buffer method implementation. 4038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 4040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 4041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 4043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None , if everything successful. 4044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 4046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_buffer( 4047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_HANDLETYPE hComp, 4048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 port, 4050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR appData, 4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 bytes, 4052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U8* buffer) 4053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE error = OMX_ErrorNone; 4055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_setbuffer_cmd setbuffers; 4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 4057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (bufferHdr == NULL || bytes == 0) 4059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode && buffer == NULL) { 4061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer); 4062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 4066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n"); 4068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 4069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(port == OMX_CORE_INPUT_PORT_INDEX) 4071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 4072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 4073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested 4074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port); 4077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev error = OMX_ErrorBadPortIndex; 4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error); 4080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(error == OMX_ErrorNone) 4081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 4083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 4086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet,OMX_StateIdle, 4087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 4090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) 4091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 4093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 4094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX, 4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 4098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) 4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 4102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_OUTPUT_PORT_INDEX, 4103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return error; 4107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex, 4110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *pmem_bufferHdr) 4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) 4113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_inp_heap_ptr[bufferindex].pBuffer) 4115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_inp_heap_ptr[bufferindex].pBuffer); 4116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr[bufferindex].pBuffer = NULL; 4117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_bufferHdr) 4119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer(pmem_bufferHdr); 4120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 4121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int index = 0; 4126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (bufferHdr == NULL || m_inp_mem_ptr == NULL) 4127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev index = bufferHdr - m_inp_mem_ptr; 4132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index); 4133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) 4135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index); 4137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) 4138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 4140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_setbuffer_cmd setbuffers; 4141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT; 4142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 4143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof (vdec_bufferpayload)); 4144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &setbuffers; 4145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 4146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ioctl_r; //= ioctl (drv_ctx.video_driver_fd, 4147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // VDEC_IOCTL_FREE_BUFFER, &ioctl_msg); 4148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl_r < 0) 4149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r); 4151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d", 4154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].pmem_fd); 4155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n unmap the input buffer size=%d address = %d", 4156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].mmaped_size, 4157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].bufferaddr); 4158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 4159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].mmaped_size); 4160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close (drv_ctx.ptr_inputbuffer[index].pmem_fd); 4161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 4162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) 4163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_desc_buffer_ptr[index].buf_addr); 4165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_desc_buffer_ptr[index].buf_addr = NULL; 4166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_desc_buffer_ptr[index].desc_data_size = 0; 4167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 4170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 4175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int index = 0; 4180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (bufferHdr == NULL || m_out_mem_ptr == NULL) 4182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev index = bufferHdr - m_out_mem_ptr; 4187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index); 4188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (index < drv_ctx.op_buf.actualcount 4190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && drv_ctx.ptr_outputbuffer) 4191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index, 4193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].bufferaddr); 4194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 4196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_setbuffer_cmd setbuffers; 4197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 4198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 4199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof (vdec_bufferpayload)); 4200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &setbuffers; 4201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = NULL; 4202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nRelease the Output Buffer"); 4203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER, 4204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &ioctl_msg) < */0) 4205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nRelease output buffer failed in VCD"); 4206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 4208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_enable_android_native_buffers) { 4209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 4210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 4211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].mmaped_size); 4212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 4214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 4215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) 4217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d", 4219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[0].pmem_fd); 4220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d address = %d", 4221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[0].mmaped_size, 4222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[0].bufferaddr); 4223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr, 4224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[0].mmaped_size); 4225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close (drv_ctx.ptr_outputbuffer[0].pmem_fd); 4226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[0].pmem_fd = -1; 4227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.op_buf_ion_info[0]); 4229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 4237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 4241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE **bufferHdr, 4242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 port, 4243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PTR appData, 4244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 bytes) 4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *input = NULL; 4247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned char *buf_addr = NULL; 4248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 4249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i = 0; 4250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* Sanity Check*/ 4252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (bufferHdr == NULL) 4253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_heap_ptr == NULL) 4258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 4260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 4261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount); 4262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 4263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 4264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount); 4265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_heap_ptr == NULL) 4267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed "); 4269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Find a Free index*/ 4274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i< drv_ctx.ip_buf.actualcount; i++) 4275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_ABSENT(&m_heap_inp_bm_count,i)) 4277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i); 4279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 4280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (i < drv_ctx.ip_buf.actualcount) 4284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 4286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buf_addr == NULL) 4288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *bufferHdr = (m_inp_heap_ptr + i); 4293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input = *bufferHdr; 4294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_heap_inp_bm_count,i); 4295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->pBuffer = (OMX_U8 *)buf_addr; 4297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 4298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->nVersion.nVersion = OMX_SPEC_VERSION; 4299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->nAllocLen = drv_ctx.ip_buf.buffer_size; 4300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->pAppPrivate = appData; 4301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 4302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr ); 4303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 4304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr [i] ); 4305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Add the Buffers to freeq*/ 4306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr [i],NULL,NULL)) 4307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Free_q is full"); 4309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 4323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 4324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::AllocateInputBuffer 4325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 4327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Helper function for allocate buffer in the input pin 4328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 4330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 4331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 4333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 4334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 4336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_buffer( 4337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_HANDLETYPE hComp, 4338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 port, 4340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR appData, 4341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 bytes) 4342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 4345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_setbuffer_cmd setbuffers; 4346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *input = NULL; 4347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 4348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i = 0; 4349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned char *buf_addr = NULL; 4350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int pmem_fd = -1; 4351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(bytes != drv_ctx.ip_buf.buffer_size) 4353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d", 4355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bytes, drv_ctx.ip_buf.buffer_size); 4356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 4357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_inp_mem_ptr) 4360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)", 4362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount, 4363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.buffer_size); 4364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 4366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 4367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_mem_ptr == NULL) 4369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \ 4374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount); 4375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_inputbuffer == NULL) 4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \ 4382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount); 4383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ip_buf_ion_info == NULL) 4385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (i=0; i < drv_ctx.ip_buf.actualcount; i++) 4391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 4393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 4395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i< drv_ctx.ip_buf.actualcount; i++) 4400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_ABSENT(&m_inp_bm_count,i)) 4402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i); 4404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 4405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(i < drv_ctx.ip_buf.actualcount) 4409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_buffer buf; 4411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_plane plane; 4412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc; 4413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Allocate input Buffer"); 4414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 4416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 4417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 4418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.ip_buf_ion_info[i].fd_ion_data, 0); 4419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 4420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 4423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 4424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = open (MEM_DEVICE,O_RDWR); 4425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_fd < 0) 4427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer"); 4429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_fd == 0) 4433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = open (MEM_DEVICE,O_RDWR); 4435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_fd < 0) 4437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer"); 4439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size, 4444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.alignment)) 4445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed"); 4447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(pmem_fd); 4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!secure_mode) { 4452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_addr = (unsigned char *)mmap(NULL, 4453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.buffer_size, 4454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 4455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buf_addr == MAP_FAILED) 4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(pmem_fd); 4459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 4461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer"); 4463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *bufferHdr = (m_inp_mem_ptr + i); 4467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (secure_mode) 4468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr; 4469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 4471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 4472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 4473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 4474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer [i].offset = 0; 4475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.index = i; 4478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 4479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.memory = V4L2_MEMORY_USERPTR; 4480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.bytesused = 0; 4481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size; 4482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr; 4483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd; 4484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.reserved[1] = 0; 4485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset; 4486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.m.planes = &plane; 4487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.length = 1; 4488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]); 4490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 4492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 4494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Failed to prepare bufs\n"); 4495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 4496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input = *bufferHdr; 4500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_inp_bm_count,i); 4501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr); 4502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (secure_mode) 4503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd; 4504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->pBuffer = (OMX_U8 *)buf_addr; 4506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 4507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->nVersion.nVersion = OMX_SPEC_VERSION; 4508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->nAllocLen = drv_ctx.ip_buf.buffer_size; 4509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->pAppPrivate = appData; 4510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 4511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; 4512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.disable_dmx) 4514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = allocate_desc_buffer(i); 4516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found"); 4521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 4522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 4528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 4529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::AllocateOutputBuffer 4530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 4532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Helper fn for AllocateBuffer in the output pin 4533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 4535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 4536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 4538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if everything went well. 4539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 4541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_buffer( 4542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_HANDLETYPE hComp, 4543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 port, 4545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR appData, 4546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 bytes) 4547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 4549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 4550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i= 0; // Temporary counter 4551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 4552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_setbuffer_cmd setbuffers; 4553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ion_device_fd =-1; 4555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct ion_allocation_data ion_alloc_data; 4556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct ion_fd_data fd_ion_data; 4557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_out_mem_ptr) 4559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)", 4561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount, 4562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size); 4563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nBufHdrSize = 0; 4564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPlatformEntrySize = 0; 4565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPlatformListSize = 0; 4566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPMEMInfoSize = 0; 4567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int pmem_fd = -1; 4568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned char *pmem_baseaddress = NULL; 4569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 4571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 4572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 4573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n", 4575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nBufHdrSize = drv_ctx.op_buf.actualcount * 4577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_BUFFERHEADERTYPE); 4578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPMEMInfoSize = drv_ctx.op_buf.actualcount * 4580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 4581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformListSize = drv_ctx.op_buf.actualcount * 4582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 4583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformEntrySize = drv_ctx.op_buf.actualcount * 4584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 4585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize, 4587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_BUFFERHEADERTYPE), 4588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPMEMInfoSize, 4589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformListSize); 4590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize, 4591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_device_fd = alloc_map_ion_memory( 4594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount, 4595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.alignment, 4596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &ion_alloc_data, &fd_ion_data, 0); 4597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ion_device_fd < 0) { 4598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = fd_ion_data.fd; 4601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 4602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = open (MEM_DEVICE,O_RDWR); 4603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_fd < 0) 4605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d", 4607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size); 4608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(pmem_fd == 0) 4612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd = open (MEM_DEVICE,O_RDWR); 4614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_fd < 0) 4616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d", 4618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size); 4619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size * 4624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount, 4625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.alignment)) 4626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed"); 4628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(pmem_fd); 4629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!secure_mode) { 4633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_baseaddress = (unsigned char *)mmap(NULL, 4634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (drv_ctx.op_buf.buffer_size * 4635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount), 4636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 4637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pmem_baseaddress == MAP_FAILED) 4638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n MMAP failed for Size %d", 4640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size); 4641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(pmem_fd); 4642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 4644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 4649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Alloc mem for platform specific info 4650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev char *pPtr=NULL; 4651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 4652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPMEMInfoSize,1); 4653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\ 4654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof(struct vdec_bufferpayload), 4655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 4657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof (struct vdec_output_frameinfo), 4658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = (struct vdec_ion *)\ 4661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof(struct vdec_ion), 4662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 4666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && drv_ctx.ptr_respbuffer) 4667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[0].mmaped_size = 4669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (drv_ctx.op_buf.buffer_size * 4670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 4671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr = m_out_mem_ptr; 4672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 4673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 4674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (((char *) m_platform_list) + nPlatformListSize); 4675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 4676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (((char *) m_platform_entry) + nPlatformEntrySize); 4677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList = m_platform_list; 4678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry = m_platform_entry; 4679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo = m_pmem_info; 4680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr); 4682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Settting the entire storage nicely 4684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry); 4685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo); 4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i < drv_ctx.op_buf.actualcount ; i++) 4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 4689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 4690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Set the values when we determine the right HxW param 4691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nAllocLen = bytes; 4692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nFilledLen = 0; 4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pAppPrivate = appData; 4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 4695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Platform specific PMEM Information 4696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Initialize the Platform Entry 4697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i); 4698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 4699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry->entry = pPMEMInfo; 4700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Initialize the Platform List 4701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList->nEntries = 1; 4702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList->entryList = pPlatformEntry; 4703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Keep pBuffer NULL till vdec is opened 4704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pBuffer = NULL; 4705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nOffset = 0; 4706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i; 4708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo->pmem_fd = 0; 4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pPlatformPrivate = pPlatformList; 4710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd; 4712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd; 4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data; 4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data; 4716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Create a mapping between buffers*/ 4719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 4720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 4721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.ptr_outputbuffer[i]; 4722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i; 4723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr = 4724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i); 4725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p", 4727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_fd, drv_ctx.ptr_outputbuffer[i].offset, 4728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr); 4729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Move the buffer and buffer header pointers 4730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr++; 4731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo++; 4732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry++; 4733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList++; 4734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\ 4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr, pPtr); 4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_mem_ptr) 4741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_out_mem_ptr); 4743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr = NULL; 4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(pPtr) 4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(pPtr); 4748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPtr = NULL; 4749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_outputbuffer) 4751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.ptr_outputbuffer); 4753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer = NULL; 4754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_respbuffer) 4756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.ptr_respbuffer); 4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer = NULL; 4759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 4762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free o/p ion context"); 4763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.op_buf_ion_info); 4764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 4765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 4768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i< drv_ctx.op_buf.actualcount; i++) 4772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_ABSENT(&m_out_bm_count,i)) 4774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i); 4776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 4777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (eRet == OMX_ErrorNone) 4781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(i < drv_ctx.op_buf.actualcount) 4783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_buffer buf; 4785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_plane plane; 4786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc; 4787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 4788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].buffer_len = 4790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size; 4791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *bufferHdr = (m_out_mem_ptr + i ); 4793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (secure_mode) { 4794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 4795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size; 4797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.index = i; 4799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 4800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.memory = V4L2_MEMORY_USERPTR; 4801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.length = drv_ctx.op_buf.buffer_size; 4802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.m.userptr = (unsigned long)(drv_ctx.ptr_outputbuffer[i].bufferaddr-drv_ctx.ptr_outputbuffer[i].offset); 4803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 4804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 4805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 4806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 4807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.data_offset = 0; 4808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.m.planes = &plane; 4809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.length = 1; 4810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]); 4812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 4813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 4814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 4815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 4819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev enum v4l2_buf_type buf_type; 4820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 4821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 4822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 4823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 4824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 4825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev streaming[CAPTURE_PORT] = true; 4826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n STREAMON Successful \n "); 4827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 4831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*bufferHdr)->pAppPrivate = appData; 4832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_SET(&m_out_bm_count,i); 4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n"); 4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 4838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer -- API Call 4846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 4847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 4848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::AllocateBuffer 4849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 4851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Returns zero if all the buffers released.. 4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 4855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 4857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 4860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 4861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 port, 4863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR appData, 4864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 bytes) 4865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i = 0; 4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 4868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port); 4870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 4871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n"); 4873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 4874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(port == OMX_CORE_INPUT_PORT_INDEX) 4877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 4879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes); 4881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); 4885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 4888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 4890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port); 4894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eRet == OMX_ErrorNone) 4898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(allocate_done()){ 4900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 4901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 4904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet,OMX_StateIdle, 4905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) 4909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) 4911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 4913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 4914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX, 4915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) 4919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) 4921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 4923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 4924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_OUTPUT_PORT_INDEX, 4925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet); 4930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 4931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call 4934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 4935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 4936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::FreeBuffer 4937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 4939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 4941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 4942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 4944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 4945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 4947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 4948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 port, 4949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_BUFFERHEADERTYPE* buffer) 4950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 4951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 4952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int nPortIndex; 4953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("In for decoder free_buffer \n"); 4954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateIdle && 4956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) 4957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n"); 4959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 4961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) 4962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port); 4964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause) 4966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n"); 4968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 4969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ErrorPortUnpopulated, 4970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 4973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (m_state != OMX_StateInvalid) 4975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n"); 4977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 4978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ErrorPortUnpopulated, 4979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 4980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 4981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(port == OMX_CORE_INPUT_PORT_INDEX) 4983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if arbitrary bytes*/ 4985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!arbitrary_bytes && !input_use_buffer) 4986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPortIndex = buffer - m_inp_mem_ptr; 4987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 4988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPortIndex = buffer - m_inp_heap_ptr; 4989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex); 4991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(nPortIndex < drv_ctx.ip_buf.actualcount) 4992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Clear the bit associated with it. 4994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 4995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 4996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (input_use_buffer == true) 4997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 4998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex); 5000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_phdr_pmem_ptr) 5001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 5002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 5006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_phdr_pmem_ptr) 5008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]); 5009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer(nPortIndex,NULL); 5011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer(buffer); 5014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_bPopulated = OMX_FALSE; 5016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Free the Buffer Header*/ 5017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (release_input_done()) 5018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released"); 5020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer_header(); 5021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n"); 5026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 5027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 5030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && release_input_done()) 5031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n"); 5033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 5034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortDisable, 5035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX, 5036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 5037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 5040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // check if the buffer is valid 5042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr; 5043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(nPortIndex < drv_ctx.op_buf.actualcount) 5044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex); 5046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Clear the bit associated with it. 5047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 5048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bPopulated = OMX_FALSE; 5049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer (buffer); 5050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (release_output_done()) 5052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer_header(); 5054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n"); 5059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 5060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 5062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && release_output_done()) 5063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n"); 5065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n"); 5067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 5068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 5069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_enable_android_native_buffers) 5070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 5072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortDisable, 5077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_OUTPUT_PORT_INDEX, 5078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 5079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 5084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((eRet == OMX_ErrorNone) && 5086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) 5087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(release_done()) 5089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 5091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 5092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet, OMX_StateLoaded, 5093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 5094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 5097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 5101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 5102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::EmptyThisBuffer 5103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 5105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev This routine is used to push the encoded video frames to 5106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev the video decoder. 5107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 5109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 5110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 5112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if everything went successful. 5113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 5115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 5116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE ret1 = OMX_ErrorNone; 5119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 5120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 5122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n"); 5124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 5125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer == NULL) 5128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL"); 5130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 5131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_inp_bEnabled) 5134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled."); 5136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 5137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) 5140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %d", buffer->nInputPortIndex); 5142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadPortIndex; 5143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 5146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(iDivXDrmDecrypt) 5147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer); 5149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drmErr != OMX_ErrorNone) { 5150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // this error can be ignored 5151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr); 5152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 5155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (perf_flag) 5156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!latency) 5158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.stop(); 5160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev latency = dec_time.processing_time_us(); 5161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.start(); 5162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 5166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nBufferIndex = buffer - m_inp_heap_ptr; 5168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (input_use_buffer == true) 5172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nBufferIndex = buffer - m_inp_heap_ptr; 5174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 5175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 5176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 5177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = &m_inp_mem_ptr[nBufferIndex]; 5178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d", 5179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen); 5180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else{ 5182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nBufferIndex = buffer - m_inp_mem_ptr; 5183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (nBufferIndex > drv_ctx.ip_buf.actualcount ) 5187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid"); 5189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 5190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)", 5193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen); 5194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 5195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event ((unsigned)hComp,(unsigned)buffer, 5197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_ETB_ARBITRARY); 5198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!(client_extradata & OMX_TIMEINFO_EXTRADATA)) 5202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev set_frame_rate(buffer->nTimeStamp); 5203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB); 5204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 5206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 5209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 5210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::empty_this_buffer_proxy 5211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 5213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev This routine is used to push the encoded video frames to 5214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev the video decoder. 5215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 5217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 5218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 5220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if everything went successful. 5221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 5223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 5224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int push_cnt = 0,i=0; 5227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned nPortIndex = 0; 5228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE ret = OMX_ErrorNone; 5229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_input_frameinfo frameinfo; 5230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_bufferpayload *temp_buffer; 5231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg; 5232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_seqheader seq_header; 5233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool port_setting_changed = true; 5234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool not_coded_vop = false; 5235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Should we generate a Aync error event*/ 5237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer == NULL || buffer->pInputPortPrivate == NULL) 5238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid"); 5240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 5241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 5244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (nPortIndex > drv_ctx.ip_buf.actualcount) 5246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 5248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPortIndex); 5249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 5250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_input_buffers++; 5253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* return zero length and not an EOS buffer */ 5255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!arbitrary_bytes && (buffer->nFilledLen == 0) && 5256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) 5257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n return zero legth buffer"); 5259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 5260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EBD); 5261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 5262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){ 5266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mp4StreamType psBits; 5267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset); 5268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psBits.numBytes = buffer->nFilledLen; 5269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mp4_headerparser.parseHeader(&psBits); 5270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev not_coded_vop = mp4_headerparser.is_notcodec_vop( 5271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 5272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(not_coded_vop) { 5273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Found Not coded vop len %d frame number %d", 5274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen,frame_count); 5275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(buffer->nFlags & OMX_BUFFERFLAG_EOS){ 5276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero"); 5277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev not_coded_vop = false; 5278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 5279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(input_flush_progress == true 5284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev || not_coded_vop 5286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 5288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Flush in progress return buffer "); 5290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event ((unsigned int)buffer,VDEC_S_SUCCESS, 5291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EBD); 5292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 5293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate; 5296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) 5298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 5300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 5303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*for use buffer we need to memcpy the data*/ 5304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_buffer->buffer_len = buffer->nFilledLen; 5305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (input_use_buffer) 5307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFilledLen <= temp_buffer->buffer_len) 5309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(arbitrary_bytes) 5311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 5313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset), 5317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen); 5318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 5323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.bufferaddr = temp_buffer->bufferaddr; 5328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.client_data = (void *) buffer; 5329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.datalen = temp_buffer->buffer_len; 5330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.flags = 0; 5331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.offset = buffer->nOffset; 5332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.pmem_fd = temp_buffer->pmem_fd; 5333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.pmem_offset = temp_buffer->offset; 5334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.timestamp = buffer->nTimeStamp; 5335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) 5336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("ETB: dmx enabled"); 5338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_demux_entries == 0) 5339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extract_demux_addr_offsets(buffer); 5341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries); 5344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev handle_demux_data(buffer); 5345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr; 5346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size; 5347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.desc_addr = NULL; 5351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.desc_size = 0; 5352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!arbitrary_bytes) 5354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.flags |= buffer->nFlags; 5356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 5359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_debug_timestamp) 5360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(arbitrary_bytes) 5362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 5364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_timestamp_list.insert_ts(buffer->nTimeStamp); 5365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) 5367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 5369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_timestamp_list.insert_ts(buffer->nTimeStamp); 5370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 5375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (inputBufferFile1) 5376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fwrite((const char *)temp_buffer->bufferaddr, 5378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_buffer->buffer_len,1,inputBufferFile1); 5379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) 5383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 5385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 5386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) 5389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached"); 5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.flags |= VDEC_BUFFERFLAG_EOS; 5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_count = 0; 5394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev look_ahead_nal = false; 5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_count = 0; 5396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.mutils) 5397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->initialize_frame_checking_environment(); 5398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.flush(); 5399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts = LLONG_MAX; 5400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_flags = 0; 5401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 5402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries = 0; 5403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_buffer buf = {0}; 5405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_plane plane; 5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc; 5407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned long print_count; 5408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) 5409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { buf.flags = V4L2_BUF_FLAG_EOS; 5410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n INPUT EOS reached \n") ; 5411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.index = nPortIndex; 5414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 5415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.memory = V4L2_MEMORY_USERPTR; 5416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.bytesused = temp_buffer->buffer_len; 5417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.length = drv_ctx.ip_buf.buffer_size; 5418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.m.userptr = (unsigned long)(temp_buffer->bufferaddr-temp_buffer->offset); 5419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.reserved[0] = temp_buffer->pmem_fd; 5420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.reserved[1] = temp_buffer->offset; 5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.data_offset = 0; 5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.m.planes = &plane; 5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.length = 1; 5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!streaming[OUTPUT_PORT]) 5426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev enum v4l2_buf_type buf_type; 5428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ret,r; 5429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 5431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 5432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!ret) { 5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Streamon on OUTPUT Plane was successful \n"); 5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev streaming[OUTPUT_PORT] = true; 5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = pthread_create(&async_thread_id,0,async_message_thread,this); 5436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ret < 0) 5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n Failed to create async_message_thread \n"); 5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else{ 5439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf(" \n Failed to call streamon on OUTPUT \n"); 5441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)", 5444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen); 5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.insert_timestamp(buffer); 5446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 5448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 5451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::FillThisBuffer 5453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev IL client uses this method to release the frame buffer 5456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev after displaying them. 5457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 5462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 5463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 5465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state == OMX_StateInvalid) 5470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("FTB in Invalid State\n"); 5472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 5473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_out_bEnabled) 5476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled."); 5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 5479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer == NULL || ((buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)) 5482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) 5487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %d", buffer->nOutputPortIndex); 5489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadPortIndex; 5490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 5493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event((unsigned) hComp, (unsigned)buffer,OMX_COMPONENT_GENERATE_FTB); 5494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 5495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 5497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 5498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::fill_this_buffer_proxy 5499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 5501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev IL client uses this method to release the frame buffer 5502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev after displaying them. 5503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 5505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 5506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 5508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 5509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 5511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( 5512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_HANDLETYPE hComp, 5513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 5514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE nRet = OMX_ErrorNone; 5516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 5517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 5518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned nPortIndex = 0; 5519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_fillbuffer_cmd fillbuffer; 5520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_bufferpayload *ptr_outputbuffer = NULL; 5521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_output_frameinfo *ptr_respbuffer = NULL; 5522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_out_mem_ptr); 5524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (bufferAdd == NULL || ((buffer - m_out_mem_ptr) > 5526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount) ) 5527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", 5530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufferAdd, bufferAdd->pBuffer); 5531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Return back the output buffer to client*/ 5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true) 5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition"); 5535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.FillBufferDone (hComp,m_app_data,buffer); 5537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 5538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_output_buffers++; 5540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate; 5541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ptr_respbuffer) 5542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data; 5544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) 5547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 5549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 5550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.FillBufferDone (hComp,m_app_data,buffer); 5551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_output_buffers--; 5552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 5553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // memcpy (&fillbuffer.buffer,ptr_outputbuffer,\ 5556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(struct vdec_bufferpayload)); 5557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // fillbuffer.client_data = bufferAdd; 5558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_enable_android_native_buffers) 5561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Acquire a write lock on this buffer. 5563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (GENLOCK_NO_ERROR != genlock_lock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle, 5564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) { 5565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Failed to acquire genlock"); 5566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 5567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.FillBufferDone (hComp,m_app_data,buffer); 5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_output_buffers--; 5569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 5570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 5571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev native_buffer[buffer - m_out_mem_ptr].inuse = true; 5572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc = 0; 5576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_buffer buf={0}; 5577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_plane plane; 5578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.index = nPortIndex; 5580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 5581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.memory = V4L2_MEMORY_USERPTR; 5582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.bytesused = buffer->nFilledLen; 5583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.length = drv_ctx.op_buf.buffer_size; 5584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.m.userptr = (unsigned long)(drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr-drv_ctx.ptr_outputbuffer[nPortIndex].offset); 5585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 5586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 5587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev plane.data_offset = 0; 5588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.m.planes = &plane; 5589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf.length = 1; 5590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 5592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 5593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 5594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Failed to qbuf to driver"); 5595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//#ifdef _ANDROID_ICS_ 5597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // if (m_enable_android_native_buffers) 5598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // { 5599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Unlock the buffer 5600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) { 5601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // DEBUG_PRINT_ERROR("Releasing genlock failed"); 5602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // return OMX_ErrorInsufficientResources; 5603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /// } else { 5604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // native_buffer[buffer - m_out_mem_ptr].inuse = false; 5605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // } 5606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // } 5607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//#endif 5608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //m_cb.FillBufferDone (hComp,m_app_data,buffer); 5609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // pending_output_buffers--; 5610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // return OMX_ErrorBadParameter; 5611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //} 5612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 5613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 5616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 5617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::SetCallbacks 5618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 5620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Set the callbacks. 5621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 5623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 5624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 5626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if everything successful. 5627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 5629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 5630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_CALLBACKTYPE* callbacks, 5631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR appData) 5632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb = *callbacks; 5635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 5636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EventHandler,m_cb.FillBufferDone); 5637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_app_data = appData; 5638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNotImplemented; 5639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 5642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 5643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::ComponentDeInit 5644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 5646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Destroys the component and release memory allocated to the heap. 5647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 5649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 5650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 5652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if everything successful. 5653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 5655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 5656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(iDivXDrmDecrypt) 5659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete iDivXDrmDecrypt; 5661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt=NULL; 5662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 5664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int i = 0; 5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (OMX_StateLoaded != m_state) 5667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\ 5669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_state); 5670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED"); 5671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Playback Ended - PASSED"); 5675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the output buffers have to be cleaned up*/ 5678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_mem_ptr) 5679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Freeing the Output Memory\n"); 5681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (i=0; i < drv_ctx.op_buf.actualcount; i++ ) 5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer (&m_out_mem_ptr[i]); 5684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 5685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_enable_android_native_buffers) 5686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (native_buffer[i].inuse) 5688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) { 5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Unlocking genlock failed"); 5691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev native_buffer[i].inuse = false; 5693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 5698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 5699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the input buffers have to be cleaned up*/ 5703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_inp_mem_ptr || m_inp_heap_ptr) 5704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Freeing the Input Memory\n"); 5706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (i=0; i<drv_ctx.ip_buf.actualcount; i++ ) 5707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_mem_ptr) 5709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer (i,&m_inp_mem_ptr[i]); 5710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer (i,NULL); 5712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer_header(); 5715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer_header(); 5716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(h264_scratch.pBuffer) 5717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(h264_scratch.pBuffer); 5719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer = NULL; 5720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (h264_parser) 5723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete h264_parser; 5725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser = NULL; 5726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_platform_list) 5729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_platform_list); 5731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = NULL; 5732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_vendor_config.pData) 5734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_vendor_config.pData); 5736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = NULL; 5737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Reset counters in mesg queues 5740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_size=0; 5741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_size=0; 5742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_size=0; 5743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_read = m_ftb_q.m_write =0; 5744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_read = m_cmd_q.m_write =0; 5745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_read = m_etb_q.m_write =0; 5746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 5747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_debug_timestamp) 5748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_timestamp_list.reset_ts_list(); 5750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG"); 5754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 5755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // NULL); 5756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Close the driver instance"); 5757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG 5759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (inputBufferFile1); 5760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 5762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (outputBufferFile1); 5763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 5765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fclose (outputExtradataFile); 5766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete"); 5768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 5769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 5772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 5773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::UseEGLImage 5774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 5776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Use EGL Image method implementation <TBD>. 5777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 5779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 5780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 5782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Not Implemented error. 5783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 5785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 5786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 5787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 port, 5788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_PTR appData, 5789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN void* eglImage) 5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list; 5792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry; 5793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info; 5794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 5796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc; 5797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev EGLint fd = -1, offset = 0,pmemPtr = 0; 5798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 5799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int fd = -1, offset = 0; 5800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\nuse EGL image support for decoder"); 5802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) { 5803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n "); 5804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 5806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_display_id == NULL) { 5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Display ID is not set by IL client \n"); 5808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 5809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC) 5811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eglGetProcAddress("eglQueryImageKHR"); 5812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd); 5813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset); 5814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr); 5815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app 5816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl { 5817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int pmem_fd; 5818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int offset; 5819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }; 5820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl *temp_egl_id = NULL; 5821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void * pmemPtr = (void *) eglImage; 5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_egl_id = (struct temp_egl *)eglImage; 5823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (temp_egl_id != NULL) 5824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = temp_egl_id->pmem_fd; 5826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev offset = temp_egl_id->offset; 5827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (fd < 0) { 5830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d \n",fd); 5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 5832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_info.pmem_fd = (OMX_U32) fd; 5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_info.offset = (OMX_U32) offset; 5835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_entry.entry = (void *) &pmem_info; 5836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 5837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_list.entryList = &pmem_entry; 5838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pmem_list.nEntries = 1; 5839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ouput_egl_buffers = true; 5840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port, 5841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void *)&pmem_list, drv_ctx.op_buf.buffer_size, 5842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_U8 *)pmemPtr)) { 5843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("use buffer call failed for egl image\n"); 5844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 5845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 5847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 5850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 5851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::ComponentRoleEnum 5852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 5854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Component Role Enum method implementation. 5855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 5857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev <TBD>. 5858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 5860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX Error None if everything is successful. 5861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 5862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 5863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OUT OMX_U8* role, 5864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_IN OMX_U32 index) 5865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 5867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) 5869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((0 == index) && role) 5871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 5873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 5874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 5878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) 5881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((0 == index) && role) 5883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 5885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 5886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 5890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) 5893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((0 == index) && role) 5895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 5897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 5898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n No more roles \n"); 5902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 5903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 5907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) 5908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 5909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((0 == index) && role) 5912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 5914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 5915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n No more roles \n"); 5919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 5920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) 5923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((0 == index) && role) 5925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 5927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 5928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n No more roles \n"); 5932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 5933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 5936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 5937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 5938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if((0 == index) && role) 5940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 5942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 5943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n No more roles \n"); 5947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorNoMore; 5948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 5951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n"); 5953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInvalidComponentName; 5954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 5956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 5962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 5963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::AllocateDone 5964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 5966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Checks if entire buffer pool is allocated by IL Client or not. 5967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Need this to move to IDLE state. 5968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 5970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 5971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 5973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false. 5974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 5976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void) 5977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet = false; 5979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet_In = false; 5980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet_Out = false; 5981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet_In = allocate_input_done(); 5983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet_Out = allocate_output_done(); 5984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(bRet_In && bRet_Out) 5986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 5987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = true; 5988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 5991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 5993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 5994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::AllocateInputDone 5995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 5997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Checks if I/P buffer pool is allocated by IL Client or not. 5998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 6000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 6001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 6003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false. 6004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 6006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void) 6007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet = false; 6009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i=0; 6010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_mem_ptr == NULL) 6012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 6014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_inp_mem_ptr ) 6016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(;i<drv_ctx.ip_buf.actualcount;i++) 6018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_ABSENT(&m_inp_bm_count,i)) 6020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(i == drv_ctx.ip_buf.actualcount) 6026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = true; 6028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 6029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) 6031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_bPopulated = OMX_TRUE; 6033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 6035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 6037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 6038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::AllocateOutputDone 6039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 6041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Checks if entire O/P buffer pool is allocated by IL Client or not. 6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 6044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false. 6048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 6050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void) 6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet = false; 6053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned j=0; 6054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_out_mem_ptr == NULL) 6056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 6058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_out_mem_ptr) 6061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(;j < drv_ctx.op_buf.actualcount;j++) 6063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_ABSENT(&m_out_bm_count,j)) 6065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(j == drv_ctx.op_buf.actualcount) 6072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = true; 6074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_bEnabled) 6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bPopulated = OMX_TRUE; 6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 6080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 6083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 6084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::ReleaseDone 6085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 6087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Checks if IL client has released all the buffers. 6088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 6090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 6091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 6093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 6094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 6096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void) 6097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet = false; 6099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(release_input_done()) 6101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(release_output_done()) 6103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = true; 6105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 6108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 6112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 6113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::ReleaseOutputDone 6114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 6116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Checks if IL client has released all the buffers. 6117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 6119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 6120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 6122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 6123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 6125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void) 6126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet = false; 6128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i=0,j=0; 6129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr); 6131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_mem_ptr) 6132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(;j < drv_ctx.op_buf.actualcount ; j++) 6134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(BITMASK_PRESENT(&m_out_bm_count,j)) 6136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(j == drv_ctx.op_buf.actualcount) 6141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bm_count = 0; 6143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = true; 6144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bm_count = 0; 6149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = true; 6150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 6152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 6154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION 6155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec::ReleaseInputDone 6156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 6158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Checks if IL client has released all the buffers. 6159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 6161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev None. 6162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 6164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev true/false 6165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */ 6167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void) 6168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool bRet = false; 6170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i=0,j=0; 6171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 6173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_inp_mem_ptr) 6174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(;j<drv_ctx.ip_buf.actualcount;j++) 6176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( BITMASK_PRESENT(&m_inp_bm_count,j)) 6178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(j==drv_ctx.ip_buf.actualcount) 6183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = true; 6185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bRet = true; 6190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bRet; 6192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp, 6195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE * buffer) 6196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 6198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) 6199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer); 6201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (output_flush_progress) 6204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 6206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 6207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nTimeStamp = 0; 6208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 6209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 6210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 6211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 6214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer, buffer->pBuffer); 6215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_output_buffers --; 6216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFlags & OMX_BUFFERFLAG_EOS) 6218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Output EOS has been reached"); 6220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!output_flush_progress) 6221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(NULL,NULL,OMX_COMPONENT_GENERATE_EOS_DONE); 6222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (psource_frame) 6224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 6226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame = NULL; 6227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pdest_frame) 6229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen = 0; 6231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL); 6232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = NULL; 6233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer); 6237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG 6238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (outputBufferFile1) 6239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fwrite (buffer->pBuffer,1,buffer->nFilledLen, 6241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev outputBufferFile1); 6242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* For use buffer we need to copy the data */ 6246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!output_flush_progress) 6247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev time_stamp_dts.get_next_timestamp(buffer, 6249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 6250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ?true:false); 6251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_cb.FillBufferDone) 6253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFilledLen > 0) 6255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata) 6257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev handle_extradata(buffer); 6258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_TIMEINFO_EXTRADATA) 6259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Keep min timestamp interval to handle corrupted bit stream scenario 6260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev set_frame_rate(buffer->nTimeStamp); 6261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (arbitrary_bytes) 6262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev adjust_timestamp(buffer->nTimeStamp); 6263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (perf_flag) 6264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!proc_frms) 6266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.stop(); 6268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev latency = dec_time.processing_time_us() - latency; 6269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3); 6270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec_time.start(); 6271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fps_metrics.start(); 6272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_frms++; 6274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFlags & OMX_BUFFERFLAG_EOS) 6275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U64 proc_time = 0; 6277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fps_metrics.stop(); 6278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_time = fps_metrics.processing_time_us(); 6279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)", 6280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_frms, (float)proc_time / 1e6, 6281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (float)(1e6 * proc_frms) / proc_time); 6282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev proc_frms = 0; 6283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 6287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (outputExtradataFile) 6288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 6291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) 6292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((unsigned)(buffer->pBuffer + buffer->nOffset + 6293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen + 3)&(~3)); 6294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(p_extra && 6295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) 6296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType); 6298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fwrite (p_extra,1,p_extra->nSize,outputExtradataFile); 6299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_extra->eType == OMX_ExtraDataNone) 6300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 6304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer->nFlags & OMX_BUFFERFLAG_EOS){ 6309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = LLONG_MAX; 6310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts = true; 6311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 6314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_QCOM_PLATFORM_PRIVATE_LIST *) 6315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->pPlatformPrivate)->entryList->entry; 6316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd); 6317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_ 6318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_enable_android_native_buffers) 6319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (native_buffer[buffer - m_out_mem_ptr].inuse) { 6321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) { 6322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Unlocking genlock failed"); 6323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 6324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 6326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev native_buffer[buffer - m_out_mem_ptr].inuse = false; 6327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.FillBufferDone (hComp,m_app_data,buffer); 6332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd); 6333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp, 6343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE* buffer) 6344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) 6347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer); 6349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 6353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer, buffer->pBuffer); 6354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_input_buffers--; 6355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 6357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pdest_frame == NULL && input_flush_progress == false) 6359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer); 6361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = buffer; 6362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 6363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nTimeStamp = LLONG_MAX; 6364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev push_input_buffer (hComp); 6365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer); 6369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 6370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_input_free_q.insert_entry((unsigned)buffer,NULL,NULL)) 6371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error"); 6373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(m_cb.EmptyBufferDone) 6377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 6379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (input_use_buffer == true){ 6380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 6381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 6383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message) 6389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_vdec* omx = NULL; 6391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_msginfo *vdec_msg = NULL; 6392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE* omxhdr = NULL; 6393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_buffer *v4l2_buf_ptr=NULL; 6394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_output_frameinfo *output_respbuf = NULL; 6395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc=1; 6396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (context == NULL || message == NULL) 6397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check"); 6399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -1; 6400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg = (struct vdec_msginfo *)message; 6402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx = reinterpret_cast<omx_vdec*>(context); 6404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 6406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (omx->m_debug_timestamp) 6407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) && 6409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev !(omx->output_flush_progress) ) 6410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_TICKS expected_ts = 0; 6412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->m_timestamp_list.pop_min_ts(expected_ts); 6413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list", 6414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.time_stamp, expected_ts); 6415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts) 6417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check"); 6419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch (vdec_msg->msgcode) 6425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_EVT_HW_ERROR: 6428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL,vdec_msg->status_code,\ 6429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 6430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_START_DONE: 6433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL,vdec_msg->status_code,\ 6434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_START_DONE); 6435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_STOP_DONE: 6438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL,vdec_msg->status_code,\ 6439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_STOP_DONE); 6440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_RESUME_DONE: 6443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL,vdec_msg->status_code,\ 6444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_RESUME_DONE); 6445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_PAUSE_DONE: 6448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL,vdec_msg->status_code,\ 6449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_PAUSE_DONE); 6450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 6453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL,vdec_msg->status_code,\ 6454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 6455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 6457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL,vdec_msg->status_code,\ 6458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 6459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_INPUT_FLUSHED: 6461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 6462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // omxhdr = (OMX_BUFFERHEADERTYPE* ) \ 6464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // vdec_msg->msgdata.input_frame_clientdata; 6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata; 6467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index; 6468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (omxhdr == NULL || 6469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) 6470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr = NULL; 6472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->status_code = VDEC_S_EFATAL; 6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code, 6476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EBD); 6477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_EVT_INFO_FIELD_DROPPED: 6479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int64_t *timestamp; 6480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev timestamp = (int64_t *) malloc(sizeof(int64_t)); 6481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (timestamp) { 6482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *timestamp = vdec_msg->msgdata.output_frame.time_stamp; 6483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event ((unsigned int)timestamp, vdec_msg->status_code, 6484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED); 6485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld", 6486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.time_stamp); 6487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_OUTPUT_FLUSHED: 6490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 6491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data; 6493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index; 6494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)", 6495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr, vdec_msg->msgdata.output_frame.time_stamp, 6496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.pic_type); 6497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (omxhdr && omxhdr->pOutputPortPrivate && 6499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) && 6500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate 6501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) 6502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) 6504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len; 6506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset; 6507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr->nTimeStamp = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nTimeStamp; 6508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags; 6509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS) 6511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr->nFlags |= OMX_BUFFERFLAG_EOS; 6513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //rc = -1; 6514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.bufferaddr=omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr; 6516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_respbuf = (struct vdec_output_frameinfo *)\ 6517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr->pOutputPortPrivate; 6518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // output_respbuf->framesize.bottom = 6519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // vdec_msg->msgdata.output_frame.framesize.bottom; 6520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // output_respbuf->framesize.left = 6521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // vdec_msg->msgdata.output_frame.framesize.left; 6522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // output_respbuf->framesize.right = 6523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // vdec_msg->msgdata.output_frame.framesize.right; 6524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // output_respbuf->framesize.top = 6525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // vdec_msg->msgdata.output_frame.framesize.top; 6526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_respbuf->len = vdec_msg->msgdata.output_frame.len; 6527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_respbuf->offset = vdec_msg->msgdata.output_frame.offset; 6528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp; 6529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // output_respbuf->flags = vdec_msg->msgdata.output_frame.flags; 6530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type; 6531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format; 6532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (omx->output_use_buffer) 6534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ( omxhdr->pBuffer, 6535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (vdec_msg->msgdata.output_frame.bufferaddr + 6536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.offset), 6537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_msg->msgdata.output_frame.len ); 6538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omxhdr->nFilledLen = 0; 6541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code, 6542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_FBD); 6543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) 6545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL, vdec_msg->status_code, 6546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EOS_DONE); 6547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event (NULL, vdec_msg->status_code, 6549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 6550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_EVT_CONFIG_CHANGED: 6552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Port settings changed"); 6553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code, 6554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_PORT_RECONFIG); 6555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VDEC_MSG_EVT_INFO_CONFIG_CHANGED: 6557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Port settings changed info"); 6559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // get_buffer_req and populate port defn structure 6560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 6561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->m_port_def.nPortIndex = 1; 6562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = omx->update_portdef(&(omx->m_port_def)); 6563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code, 6564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG); 6565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 6568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return rc; 6571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary ( 6574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_HANDLETYPE hComp, 6575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *buffer 6576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ) 6577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned address,p2,id; 6579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Empty this arbitrary"); 6580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer == NULL) 6582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 6586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u", 6587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp); 6588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* return zero length and not an EOS buffer */ 6590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* return buffer if input flush in progress */ 6591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) && 6592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) 6593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress"); 6595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone (hComp,m_app_data,buffer); 6596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (psource_frame == NULL) 6600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp); 6602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame = buffer; 6603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Try to Push One Input Buffer "); 6604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev push_input_buffer (hComp); 6605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer); 6609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_input_pending_q.insert_entry((unsigned)buffer,NULL,NULL)) 6610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp) 6620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned address,p2,id; 6622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE ret = OMX_ErrorNone; 6623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pdest_frame == NULL || psource_frame == NULL) 6625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if we have a destination buffer*/ 6627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pdest_frame == NULL) 6628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue"); 6630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_free_q.m_size) 6631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_free_q.pop_entry(&address,&p2,&id); 6633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = (OMX_BUFFERHEADERTYPE *)address; 6634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen = 0; 6635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nTimeStamp = LLONG_MAX; 6636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame); 6637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if we have a destination buffer*/ 6641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (psource_frame == NULL) 6642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Get a source buffer from the queue"); 6644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_pending_q.m_size) 6645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_pending_q.pop_entry(&address,&p2,&id); 6647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame = (OMX_BUFFERHEADERTYPE *)address; 6648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame, 6649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame->nTimeStamp); 6650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d", 6651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame->nFlags,psource_frame->nFilledLen); 6652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while ((pdest_frame != NULL) && (psource_frame != NULL)) 6659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch (codec_type_parse) 6661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case CODEC_TYPE_MPEG4: 6663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case CODEC_TYPE_H263: 6664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case CODEC_TYPE_MPEG2: 6665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = push_input_sc_codec(hComp); 6666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case CODEC_TYPE_H264: 6668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = push_input_h264(hComp); 6669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case CODEC_TYPE_VC1: 6671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = push_input_vc1(hComp); 6672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ret != OMX_ErrorNone) 6675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed"); 6677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_report_error (); 6678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 6679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 6683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp) 6686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 partial_frame = 1; 6688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BOOL generate_ebd = OMX_TRUE; 6689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned address,p2,id; 6690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d", 6692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame,psource_frame->nTimeStamp); 6693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.parse_sc_frame(psource_frame, 6694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame,&partial_frame) == -1) 6695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error In Parsing Return Error"); 6697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (partial_frame == 0) 6701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d", 6703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen,psource_frame,frame_count); 6704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp); 6707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*First Parsed buffer will have only header Hence skip*/ 6708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (frame_count == 0) 6709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame "); 6711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(codec_type_parse == CODEC_TYPE_MPEG4 || 6713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev codec_type_parse == CODEC_TYPE_DIVX) { 6714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mp4StreamType psBits; 6715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset; 6716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psBits.numBytes = pdest_frame->nFilledLen; 6717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mp4_headerparser.parseHeader(&psBits); 6718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_count++; 6721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 6725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(pdest_frame->nFilledLen) 6726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Push the frame to the Decoder*/ 6728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) 6729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_count++; 6733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = NULL; 6734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_free_q.m_size) 6736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_free_q.pop_entry(&address,&p2,&id); 6738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 6739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen = 0; 6740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) 6743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL"); 6745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL); 6746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = NULL; 6747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen); 6753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if Destination Buffer is full*/ 6754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pdest_frame->nAllocLen == 6755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen + pdest_frame->nOffset) 6756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled"); 6758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorStreamCorrupt; 6759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (psource_frame->nFilledLen == 0) 6763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) 6765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pdest_frame) 6767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags |= psource_frame->nFlags; 6769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x", 6770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 6771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d", 6772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen,frame_count++); 6773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Push the frame to the Decoder*/ 6774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) 6775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_count++; 6779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = NULL; 6780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Last frame in else dest addr") ; 6784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev generate_ebd = OMX_FALSE; 6785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(generate_ebd) 6788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame); 6790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 6791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame = NULL; 6792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_pending_q.m_size) 6794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame); 6796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_pending_q.pop_entry(&address,&p2,&id); 6797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame = (OMX_BUFFERHEADERTYPE *) address; 6798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame, 6799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame->nTimeStamp); 6800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d", 6801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame->nFlags,psource_frame->nFilledLen); 6802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 6806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp) 6809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 partial_frame = 1; 6811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned address,p2,id; 6812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BOOL isNewFrame = OMX_FALSE; 6813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BOOL generate_ebd = OMX_TRUE; 6814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (h264_scratch.pBuffer == NULL) 6816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated"); 6818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d " 6821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal); 6822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 6823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (h264_scratch.nFilledLen && look_ahead_nal) 6824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev look_ahead_nal = false; 6826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 6827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen) 6828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 6830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer,h264_scratch.nFilledLen); 6831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += h264_scratch.nFilledLen; 6832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame"); 6833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 6834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264"); 6838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (nal_length == 0) 6842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code"); 6844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.parse_sc_frame(psource_frame, 6845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &h264_scratch,&partial_frame) == -1) 6846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error In Parsing Return Error"); 6848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length); 6854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.parse_h264_nallength(psource_frame, 6855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &h264_scratch,&partial_frame) == -1) 6856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error"); 6858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (partial_frame == 0) 6863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (nal_count == 0 && h264_scratch.nFilledLen == 0) 6865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip"); 6867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_count++; 6868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 6869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFlags = psource_frame->nFlags; 6870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen); 6874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(h264_scratch.nFilledLen) 6875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen, 6877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev NALU_TYPE_SPS); 6878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 6879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_TIMEINFO_EXTRADATA) 6880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 6881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen, NALU_TYPE_SEI); 6882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 6883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // If timeinfo is present frame info from SEI is already processed 6884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 6885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen, NALU_TYPE_SEI); 6886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 6888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_count++; 6889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) { 6890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nTimeStamp = h264_last_au_ts; 6891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags = h264_last_au_flags; 6892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR 6893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 6894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->update_panscan_data(h264_last_au_ts); 6895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR || 6898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) { 6899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts = h264_scratch.nTimeStamp; 6900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_flags = h264_scratch.nFlags; 6901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 6902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_TIMEINFO_EXTRADATA) 6903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts); 6905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!VALID_TS(h264_last_au_ts)) 6906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts = ts_in_sei; 6907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else 6910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_last_au_ts = LLONG_MAX; 6911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!isNewFrame) 6914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 6916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen) 6917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d", 6919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen); 6920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 6921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer,h264_scratch.nFilledLen); 6922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += h264_scratch.nFilledLen; 6923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ) 6924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 6925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 6926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264"); 6930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev look_ahead_nal = true; 6936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x", 6937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 6938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d", 6939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen,frame_count++); 6940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pdest_frame->nFilledLen == 0) 6942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it"); 6944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev look_ahead_nal = false; 6945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 6946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen) 6947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 6949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer,h264_scratch.nFilledLen); 6950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += h264_scratch.nFilledLen; 6951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 6952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264"); 6956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(psource_frame->nFilledLen || h264_scratch.nFilledLen) 6962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Reset the EOS Flag"); 6964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 6965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Push the frame to the Decoder*/ 6967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) 6968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 6970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //frame_count++; 6972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = NULL; 6973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_free_q.m_size) 6974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_free_q.pop_entry(&address,&p2,&id); 6976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 6977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame); 6978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen = 0; 6979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags = 0; 6980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nTimeStamp = LLONG_MAX; 6981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 6987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen); 6989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if Destination Buffer is full*/ 6990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (h264_scratch.nAllocLen == 6991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen + h264_scratch.nOffset) 6992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 6993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled"); 6994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorStreamCorrupt; 6995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!psource_frame->nFilledLen) 6999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame); 7001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) 7003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pdest_frame) 7005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer"); 7007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 7008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen) 7009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 7011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer,h264_scratch.nFilledLen); 7012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += h264_scratch.nFilledLen; 7013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.nFilledLen = 0; 7014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264"); 7018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 7021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 7022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%d TimeStamp = %x", 7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++); 7026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 7027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_TIMEINFO_EXTRADATA) 7028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp); 7030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!VALID_TS(pdest_frame->nTimeStamp)) 7031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nTimeStamp = ts_in_sei; 7032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Push the frame to the Decoder*/ 7035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) 7036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_count++; 7040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame = NULL; 7041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d", 7045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame,h264_scratch.nFilledLen); 7046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev generate_ebd = OMX_FALSE; 7047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(generate_ebd && !psource_frame->nFilledLen) 7051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 7053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame = NULL; 7054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_input_pending_q.m_size) 7055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame); 7057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_input_pending_q.pop_entry(&address,&p2,&id); 7058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame = (OMX_BUFFERHEADERTYPE *) address; 7059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d", 7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev psource_frame->nFlags,psource_frame->nFilledLen); 7061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 7064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp) 7067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buf, *pdest; 7069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 partial_frame = 1; 7070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 buf_len, dest_len; 7071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(first_frame == 0) 7073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev first_frame = 1; 7075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n"); 7076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_vendor_config.pData) 7077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n"); 7079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf = psource_frame->pBuffer; 7080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_len = psource_frame->nFilledLen; 7081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) == 7083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VC1_SP_MP_START_CODE) 7084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vc1_profile = VC1_SP_MP_RCV; 7086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) 7088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vc1_profile = VC1_AP; 7090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n"); 7094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorStreamCorrupt; 7095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen + 7100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nOffset; 7101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen + 7102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nOffset); 7103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(dest_len < m_vendor_config.nDataSize) 7105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nDestination buffer full\n"); 7107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize); 7112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += m_vendor_config.nDataSize; 7113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch(m_vc1_profile) 7118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VC1_AP: 7120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code"); 7121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (push_input_sc_codec(hComp) != OMX_ErrorNone) 7122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code"); 7124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 7127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VC1_SP_MP_RCV: 7129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 7130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode\n"); 7131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 7134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 7137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 alignment) 7138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct pmem_allocation allocation; 7140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev allocation.size = buffer_size; 7141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev allocation.align = clip2(alignment); 7142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (allocation.align < 4096) 7143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev allocation.align = 4096; 7145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) 7147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)", 7149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev allocation.align, allocation.size); 7150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return false; 7151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return true; 7153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size, 7156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 alignment, struct ion_allocation_data *alloc_data, 7157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct ion_fd_data *fd_data, int flag) 7158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int fd = -EINVAL; 7160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc = -EINVAL; 7161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ion_dev_flag; 7162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ion ion_buf_info; 7163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!alloc_data || buffer_size <= 0 || !fd_data) { 7164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n"); 7165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -EINVAL; 7166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!secure_mode && flag == CACHED) 7168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_dev_flag = O_RDONLY; 7170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 7171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_dev_flag = (O_RDONLY | O_DSYNC); 7172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = open (MEM_DEVICE, ion_dev_flag); 7174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (fd < 0) { 7175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd); 7176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 7177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->len = buffer_size; 7179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->align = clip2(alignment); 7180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (alloc_data->align < 4096) 7181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->align = 4096; 7183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(secure_mode) { 7185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->flags = (ION_HEAP(MEM_HEAP_ID) | ION_SECURE); 7186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 7187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->flags = ION_HEAP(MEM_HEAP_ID); 7188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 7190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc || !alloc_data->handle) { 7191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ION ALLOC memory failed "); 7192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev alloc_data->handle = NULL; 7193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(fd); 7194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = -ENOMEM; 7195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 7196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd_data->handle = alloc_data->handle; 7198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(fd,ION_IOC_MAP,fd_data); 7199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 7200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ION MAP failed "); 7201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_buf_info.ion_alloc_data = *alloc_data; 7202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_buf_info.ion_device_fd = fd; 7203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ion_buf_info.fd_ion_data = *fd_data; 7204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_ion_memory(&ion_buf_info); 7205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd_data->fd =-1; 7206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(fd); 7207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = -ENOMEM; 7208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 7211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) { 7214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!buf_ion_info) { 7216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata"); 7217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return; 7218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 7220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &buf_ion_info->ion_alloc_data.handle)) { 7221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n ION: free failed" ); 7222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev close(buf_ion_info->ion_device_fd); 7224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_ion_info->ion_device_fd = -1; 7225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_ion_info->ion_alloc_data.handle = NULL; 7226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_ion_info->fd_ion_data.fd = -1; 7227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header() 7230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released"); 7232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev output_use_buffer = false; 7233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ouput_egl_buffers = false; 7234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_out_mem_ptr) 7236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (m_out_mem_ptr); 7238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr = NULL; 7239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_platform_list) 7242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_platform_list); 7244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = NULL; 7245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_respbuffer) 7248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (drv_ctx.ptr_respbuffer); 7250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer = NULL; 7251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_outputbuffer) 7253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (drv_ctx.ptr_outputbuffer); 7255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer = NULL; 7256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 7259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free o/p ion context"); 7260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.op_buf_ion_info); 7261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 7262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header() 7267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_use_buffer = false; 7269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (arbitrary_bytes) 7270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_frame_parser.mutils) 7272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free utils parser"); 7274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete (m_frame_parser.mutils); 7275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_frame_parser.mutils = NULL; 7276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_heap_ptr) 7279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free input Heap Pointer"); 7281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (m_inp_heap_ptr); 7282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_heap_ptr = NULL; 7283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_phdr_pmem_ptr) 7286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free input pmem header Pointer"); 7288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (m_phdr_pmem_ptr); 7289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_phdr_pmem_ptr = NULL; 7290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_inp_mem_ptr) 7293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free input pmem Pointer area"); 7295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (m_inp_mem_ptr); 7296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_inp_mem_ptr = NULL; 7297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ptr_inputbuffer) 7299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free Driver Context pointer"); 7301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free (drv_ctx.ptr_inputbuffer); 7302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_inputbuffer = NULL; 7303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ip_buf_ion_info) { 7306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free ion context"); 7307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.ip_buf_ion_info); 7308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info = NULL; 7309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::stream_off() 7313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc=0; 7315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev enum v4l2_buf_type btype; 7316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 7317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype); 7318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rc) { 7319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 7320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("\n Failed to call streamoff on OUTPUT Port \n"); 7321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 7322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev streaming[CAPTURE_PORT] = false; 7323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop) 7327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_requestbuffers bufreq; 7330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int buf_size = 0, extra_data_size = 0; 7331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_format fmt; 7332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ret; 7333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)", 7334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->actualcount, buffer_prop->buffer_size); 7335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufreq.memory = V4L2_MEMORY_USERPTR; 7336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(in_reconfig == true) 7337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufreq.count = 0; 7338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufreq.count = 2; 7340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){ 7341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 7342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 7343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.pixelformat = output_capability; 7344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT){ 7345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 7346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 7347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.pixelformat = capture_capability; 7348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }else {eRet = OMX_ErrorBadParameter;} 7349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(eRet==OMX_ErrorNone){ 7350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 7351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ret) 7353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 7355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 7356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 7357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->actualcount = bufreq.count; 7362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->mincount = bufreq.count; 7363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Count = %d \n ",bufreq.count); 7364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)", 7366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->actualcount, buffer_prop->buffer_size); 7367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 7369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 7370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 7372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_height = fmt.fmt.pix_mp.height; 7374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.video_resolution.frame_width = fmt.fmt.pix_mp.width; 7375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev printf("Buffer Size = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage); 7377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ret) 7379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 7381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 7382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 7383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 7387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_size = buffer_prop->buffer_size; 7388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 7389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Frame info extra data enabled!"); 7391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE; 7392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_INTERLACE_EXTRADATA) 7394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Interlace extra data enabled!"); 7396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE; 7397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_PORTDEF_EXTRADATA) 7399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE; 7401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n", 7402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data_size); 7403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (extra_data_size) 7405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator 7407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit 7408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_size += extra_data_size; 7410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 7411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)", 7412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->actualcount, buffer_prop->buffer_size, buf_size); 7413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (in_reconfig) // BufReq will be set to driver when port is disabled 7414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->buffer_size = buf_size; 7415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (buf_size != buffer_prop->buffer_size) 7416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->buffer_size = buf_size; 7418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = set_buffer_req(buffer_prop); 7419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)", 7422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->actualcount, buffer_prop->buffer_size); 7423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop) 7427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned buf_size = 0; 7430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_format fmt; 7431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int ret; 7432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)", 7433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->actualcount, buffer_prop->buffer_size); 7434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 7435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buf_size != buffer_prop->buffer_size) 7436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)", 7438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_prop->buffer_size, buf_size); 7439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 7440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 7444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 7445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){ 7446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 7447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.pixelformat = output_capability; 7448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT){ 7449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevfmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 7450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fmt.fmt.pix_mp.pixelformat = capture_capability; 7451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} else {eRet = OMX_ErrorBadParameter;} 7452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 7453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ret) 7454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*TODO: How to handle this case */ 7456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setting buffer requirements failed"); 7457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 7458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::start_port_reconfig() 7464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 7466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev enum v4l2_buf_type btype; 7468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int rc = 0,i; 7469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_plane plane; 7470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_buffer v4l2_buf ={0}; 7471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_decoder_cmd dec; 7472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dec.cmd = V4L2_DEC_CMD_STOP; 7473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec); 7474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 7475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev in_reconfig = true; 7476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution() 7480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 7482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = NULL; 7484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.out = &drv_ctx.video_resolution; 7485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg)*/0) 7486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES"); 7488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorHardware; 7489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 7494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!portDefn) 7497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("omx_vdec::update_portdef\n"); 7501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nSize = sizeof(portDefn); 7503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->eDomain = OMX_PortDomainVideo; 7504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.frame_rate.fps_denominator > 0) 7505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator / 7506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_denominator; 7507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 7508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Error: Divide by zero \n"); 7509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 7510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (0 == portDefn->nPortIndex) 7512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->eDir = OMX_DirInput; 7514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 7515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 7516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 7517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused; 7518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.eCompressionFormat = eCompressionFormat; 7519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->bEnabled = m_inp_bEnabled; 7520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->bPopulated = m_inp_bPopulated; 7521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (1 == portDefn->nPortIndex) 7523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->eDir = OMX_DirOutput; 7525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet=get_buffer_req(&drv_ctx.op_buf); 7526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (in_reconfig) 7527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountActual = op_buf_rcnfg.actualcount; 7529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountMin = op_buf_rcnfg.mincount; 7530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferSize = op_buf_rcnfg.buffer_size; 7531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 7535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 7536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->nBufferSize = drv_ctx.op_buf.buffer_size; 7537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 7539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->bEnabled = m_out_bEnabled; 7540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->bPopulated = m_out_bPopulated; 7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 7542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 7543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2) 7544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE) 7545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka; 7546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: Color format unknown: %x\n", drv_ctx.output_format); 7549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->eDir = OMX_DirMax; 7554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 7555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (int)portDefn->nPortIndex); 7556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 7557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height; 7559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width; 7560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nStride = drv_ctx.video_resolution.stride; 7561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines; 7562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("update_portdef Width = %d Height = %d Stride = %u" 7563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "SliceHeight = %u \n", portDefn->format.video.nFrameHeight, 7564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth, 7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nStride, 7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nSliceHeight); 7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers() 7572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 7574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *bufHdr = NULL; 7575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i= 0; 7576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!m_out_mem_ptr) { 7578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation"); 7579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nBufHdrSize = 0; 7580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPlatformEntrySize = 0; 7581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPlatformListSize = 0; 7582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int nPMEMInfoSize = 0; 7583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 7584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 7585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 7586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n", 7588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 7589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nBufHdrSize = drv_ctx.op_buf.actualcount * 7590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_BUFFERHEADERTYPE); 7591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPMEMInfoSize = drv_ctx.op_buf.actualcount * 7593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 7594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformListSize = drv_ctx.op_buf.actualcount * 7595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 7596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformEntrySize = drv_ctx.op_buf.actualcount * 7597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 7598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize, 7600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sizeof(OMX_BUFFERHEADERTYPE), 7601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPMEMInfoSize, 7602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPlatformListSize); 7603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize, 7604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bm_count); 7605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 7606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Alloc mem for platform specific info 7607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev char *pPtr=NULL; 7608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 7609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nPMEMInfoSize,1); 7610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \ 7611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof(struct vdec_bufferpayload), 7612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 7613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 7614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof (struct vdec_output_frameinfo), 7615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.actualcount); 7616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \ 7618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount); 7619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 7622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && drv_ctx.ptr_respbuffer) 7623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr = m_out_mem_ptr; 7625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 7626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 7627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (((char *) m_platform_list) + nPlatformListSize); 7628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 7629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (((char *) m_platform_entry) + nPlatformEntrySize); 7630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList = m_platform_list; 7631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry = m_platform_entry; 7632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo = m_pmem_info; 7633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr); 7635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Settting the entire storage nicely 7637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, 7638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr,pPlatformEntry); 7639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo); 7640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i < drv_ctx.op_buf.actualcount ; i++) 7641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 7643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 7644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Set the values when we determine the right HxW param 7645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nAllocLen = 0; 7646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nFilledLen = 0; 7647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pAppPrivate = NULL; 7648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 7649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 7650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry->entry = pPMEMInfo; 7651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Initialize the Platform List 7652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList->nEntries = 1; 7653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList->entryList = pPlatformEntry; 7654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Keep pBuffer NULL till vdec is opened 7655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pBuffer = NULL; 7656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo->offset = 0; 7657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo->pmem_fd = 0; 7658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pPlatformPrivate = pPlatformList; 7659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 7662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Create a mapping between buffers*/ 7664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 7665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 7666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev &drv_ctx.ptr_outputbuffer[i]; 7667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Move the buffer and buffer header pointers 7668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bufHdr++; 7669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPMEMInfo++; 7670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformEntry++; 7671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPlatformList++; 7672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\n",\ 7677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr, pPtr); 7678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_out_mem_ptr) 7679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_out_mem_ptr); 7681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_mem_ptr = NULL; 7682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(pPtr) 7684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(pPtr); 7686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pPtr = NULL; 7687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_outputbuffer) 7689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.ptr_outputbuffer); 7691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer = NULL; 7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(drv_ctx.ptr_respbuffer) 7694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.ptr_respbuffer); 7696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_respbuffer = NULL; 7697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 7700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n Free o/p ion context"); 7701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(drv_ctx.op_buf_ion_info); 7702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 7703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 7706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 7708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorInsufficientResources; 7709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 7711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs() 7714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned p1; 7716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned p2; 7717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned ident; 7718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_cmd_queue tmp_q, pending_bd_q; 7719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_lock(&m_lock); 7720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // pop all pending GENERATE FDB from ftb queue 7721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (m_ftb_q.m_size) 7722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.pop_entry(&p1,&p2,&ident); 7724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ident == OMX_COMPONENT_GENERATE_FBD) 7725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_bd_q.insert_entry(p1,p2,ident); 7727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev tmp_q.insert_entry(p1,p2,ident); 7731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //return all non GENERATE FDB to ftb queue 7734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(tmp_q.m_size) 7735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev tmp_q.pop_entry(&p1,&p2,&ident); 7737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.insert_entry(p1,p2,ident); 7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // pop all pending GENERATE EDB from etb queue 7740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (m_etb_q.m_size) 7741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.pop_entry(&p1,&p2,&ident); 7743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(ident == OMX_COMPONENT_GENERATE_EBD) 7744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_bd_q.insert_entry(p1,p2,ident); 7746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev tmp_q.insert_entry(p1,p2,ident); 7750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //return all non GENERATE FDB to etb queue 7753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(tmp_q.m_size) 7754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev tmp_q.pop_entry(&p1,&p2,&ident); 7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.insert_entry(p1,p2,ident); 7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pthread_mutex_unlock(&m_lock); 7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // process all pending buffer dones 7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(pending_bd_q.m_size) 7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_bd_q.pop_entry(&p1,&p2,&ident); 7763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch(ident) 7764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_EBD: 7766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) 7767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n"); 7769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_report_error (); 7770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 7772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case OMX_COMPONENT_GENERATE_FBD: 7774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) 7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n"); 7777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev omx_report_error (); 7778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp) 7785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 new_frame_interval = 0; 7787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 7788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 7789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) 7790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev new_frame_interval = (act_timestamp > prev_ts)? 7792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev act_timestamp - prev_ts : 7793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts - act_timestamp; 7794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (new_frame_interval < frm_int || frm_int == 0) 7795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int = new_frame_interval; 7797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(frm_int) 7798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_numerator = 1e6; 7800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.frame_rate.fps_denominator = frm_int; 7801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)", 7802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frm_int, drv_ctx.frame_rate.fps_numerator / 7803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (float)drv_ctx.frame_rate.fps_denominator); 7804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ioctl_msg.in = &drv_ctx.frame_rate; 7805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE, 7806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (void*)&ioctl_msg) < */0) 7807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Setting frame rate failed"); 7809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = act_timestamp; 7814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp) 7817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rst_prev_ts && VALID_TS(act_timestamp)) 7819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = act_timestamp; 7821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts = false; 7822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (VALID_TS(prev_ts)) 7824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bool codec_cond = (drv_ctx.timestamp_adjust)? 7826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)? 7827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)): 7828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (!VALID_TS(act_timestamp) || act_timestamp == prev_ts); 7829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(frm_int > 0 && codec_cond) 7830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 7832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev act_timestamp = prev_ts + frm_int; 7833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 7834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev prev_ts = act_timestamp; 7835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev set_frame_rate(act_timestamp); 7838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (frm_int > 0) // In this case the frame rate was set along 7840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { // with the port definition, start ts with 0 7841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 7842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rst_prev_ts = true; 7843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 7847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL; 7849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 num_conceal_MB = 0; 7850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S64 ts_in_sei = 0; 7851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 frame_rate = 0; 7852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) 7853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((unsigned)(p_buf_hdr->pBuffer + p_buf_hdr->nOffset + 7854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFilledLen + 3)&(~3)); 7855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen)) 7856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = NULL; 7857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)) 7858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Process driver extradata 7860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE) 7861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)", 7863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize); 7864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_extra->nSize < p_extra->nDataSize) 7865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d", 7867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->nSize, p_extra->nDataSize); 7868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 7869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen) || 7870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->nDataSize == 0) 7871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = NULL; 7872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev continue; 7873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP) 7875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 7877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev num_conceal_MB = count_MB_in_extradata(p_extra); 7878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP) 7879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Map driver extradata to corresponding OMX type 7880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB; 7881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client 7883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_debug_concealedmb) { 7884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB); 7885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (p_extra->eType == VDEC_EXTRADATA_SEI) 7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_sei = p_extra; 7890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI); 7892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client 7894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (p_extra->eType == VDEC_EXTRADATA_VUI) 7896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_vui = p_extra; 7898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false); 7900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client 7902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev print_debug_extradata(p_extra); 7904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 7905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen) || 7906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra->nDataSize == 0) 7907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = NULL; 7908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)) 7910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Driver extradata is only exposed if MB map is requested by client, 7912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // otherwise can be overwritten by omx extradata. 7913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) 7914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((unsigned)(p_buf_hdr->pBuffer + p_buf_hdr->nOffset + 7915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFilledLen + 3)&(~3)); 7916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT 7921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 7922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_TIMEINFO_EXTRADATA) 7924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_vui) 7926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false); 7927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_sei) 7928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI); 7929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp); 7930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!VALID_TS(p_buf_hdr->nTimeStamp)) 7931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nTimeStamp = ts_in_sei; 7932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei) 7934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // If timeinfo is present frame info from SEI is already processed 7935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI); 7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra && 7939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) < 7940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen)) 7941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 7943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev append_interlace_extradata(p_extra, 7944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format); 7945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 7946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra && 7948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) < 7949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen)) 7950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 7952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /* vui extra data (frame_rate) information */ 7953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (h264_parser) 7954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->get_frame_rate(&frame_rate); 7955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev append_frame_info_extradata(p_extra, num_conceal_MB, 7956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, 7957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nTimeStamp, frame_rate, NULL); 7958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 7959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((client_extradata & OMX_PORTDEF_EXTRADATA) && 7961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra != NULL && 7962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) < 7963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen)) 7964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 7966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev append_portdef_extradata(p_extra); 7967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 7968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA) 7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_extra && 7971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) < 7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen)) 7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev append_terminator_extradata(p_extra); 7974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 7975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added"); 7977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 7978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable) 7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 7983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE ret = OMX_ErrorNone; 7984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 driver_extradata = 0, extradata_size = 0; 7985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct vdec_ioctl_msg ioctl_msg = {NULL, NULL}; 7986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(m_state != OMX_StateLoaded) 7987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 7989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 7990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) 7992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE; 7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (requested_extradata & OMX_INTERLACE_EXTRADATA) 7994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extradata_size += OMX_INTERLACE_EXTRADATA_SIZE; 7995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (requested_extradata & OMX_PORTDEF_EXTRADATA) 7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extradata_size += OMX_PORTDEF_EXTRADATA_SIZE; 7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]", 8000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev client_extradata, requested_extradata, enable); 8001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (enable) 8003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev requested_extradata |= client_extradata; 8004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev requested_extradata = client_extradata & ~requested_extradata; 8007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extradata_size *= -1; 8008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK; 8011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) 8012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info 8013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT 8014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 8015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)? 8017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info 8018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)? 8019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info 8020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (driver_extradata != drv_ctx.extradata) 8024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev client_extradata = requested_extradata; 8026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.extradata = driver_extradata; 8027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //ioctl_msg.in = &drv_ctx.extradata; 8028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //ioctl_msg.out = NULL; 8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA, 8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // (void*)&ioctl_msg) < 0) 8031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //{ 8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // DEBUG_PRINT_ERROR("\nSet extradata failed"); 8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // ret = OMX_ErrorUnsupportedSetting; 8034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //} // else 8035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // ret = get_buffer_req(&drv_ctx.op_buf); 8036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK)) 8038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev client_extradata = requested_extradata; 8040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size += extradata_size; 8041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // align the buffer size 8042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size = (drv_ctx.op_buf.buffer_size + drv_ctx.op_buf.alignment - 1)&(~(drv_ctx.op_buf.alignment - 1)); 8043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d\n", drv_ctx.op_buf.buffer_size); 8044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator 8045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE); 8046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret = set_buffer_req(&drv_ctx.op_buf); 8047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret; 8049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra) 8052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0; 8054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *data_ptr = extra->data, data = 0; 8055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (byte_count < extra->nDataSize) 8056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev data = *data_ptr; 8058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (data) 8059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev num_MB += (data&0x01); 8061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev data >>= 1; 8062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev data_ptr++; 8064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_count++; 8065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 8067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (drv_ctx.video_resolution.frame_height + 15)) >> 8; 8068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0); 8069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra) 8072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!m_debug_extradata) 8074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return; 8075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 8077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "============== Extra Data ==============\n" 8078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Size: %u \n" 8079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Version: %u \n" 8080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " PortIndex: %u \n" 8081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Type: %x \n" 8082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " DataSize: %u \n", 8083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nSize, extra->nVersion.nVersion, 8084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nPortIndex, extra->eType, extra->nDataSize); 8085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (extra->eType == OMX_ExtraDataInterlaceFormat) 8087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data; 8089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 8090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "------ Interlace Format ------\n" 8091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Size: %u \n" 8092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Version: %u \n" 8093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " PortIndex: %u \n" 8094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Is Interlace Format: %u \n" 8095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Interlace Formats: %u \n" 8096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "=========== End of Interlace ===========\n", 8097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex, 8098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev intfmt->bInterlaceFormat, intfmt->nInterlaceFormats); 8099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (extra->eType == OMX_ExtraDataFrameInfo) 8101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 8103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 8105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "-------- Frame Format --------\n" 8106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Picture Type: %u \n" 8107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Interlace Type: %u \n" 8108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Pan Scan Total Frame Num: %u \n" 8109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Concealed Macro Blocks: %u \n" 8110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " frame rate: %u \n" 8111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Aspect Ratio X: %u \n" 8112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Aspect Ratio Y: %u \n", 8113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->ePicType, 8114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->interlaceType, 8115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->panScan.numWindows, 8116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->nConcealedMacroblocks, 8117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->nFrameRate, 8118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->aspectRatio.aspectRatioX, 8119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->aspectRatio.aspectRatioY); 8120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (int i = 0; i < fminfo->panScan.numWindows; i++) 8122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 8124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "------------------------------\n" 8125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Pan Scan Frame Num: %d \n" 8126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Rectangle x: %d \n" 8127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Rectangle y: %d \n" 8128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Rectangle dx: %d \n" 8129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev " Rectangle dy: %d \n", 8130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y, 8131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy); 8132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("========= End of Frame Format =========="); 8135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (extra->eType == OMX_ExtraDataNone) 8137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("========== End of Terminator ==========="); 8139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("======= End of Driver Extradata ========"); 8143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 8147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 interlaced_format_type) 8148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_STREAMINTERLACEFORMAT *interlace_format; 8150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 mbaff = 0; 8151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE; 8152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nVersion.nVersion = OMX_SPEC_VERSION; 8153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 8154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat; 8155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT); 8156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data; 8157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT); 8158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->nVersion.nVersion = OMX_SPEC_VERSION; 8159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 8160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev mbaff = (h264_parser)? (h264_parser->is_mbaff()): false; 8161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((interlaced_format_type == VDEC_InterlaceFrameProgressive) && !mbaff) 8162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->bInterlaceFormat = OMX_FALSE; 8164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 8165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 8166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->bInterlaceFormat = OMX_TRUE; 8170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; 8171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 8172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev print_debug_extradata(extra); 8174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 8178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp, OMX_U32 frame_rate, 8179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev vdec_aspectratioinfo *aspect_ratio_info) 8180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL; 8182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE; 8183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nVersion.nVersion = OMX_SPEC_VERSION; 8184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 8185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo; 8186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO); 8187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data; 8188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch (picture_type) 8189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case PICTURE_TYPE_I: 8191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->ePicType = OMX_VIDEO_PictureTypeI; 8192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 8193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case PICTURE_TYPE_P: 8194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->ePicType = OMX_VIDEO_PictureTypeP; 8195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 8196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case PICTURE_TYPE_B: 8197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->ePicType = OMX_VIDEO_PictureTypeB; 8198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 8199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 8200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0; 8201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 8203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 8204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 8205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 8206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive; 8208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&frame_info->panScan,0,sizeof(frame_info->panScan)); 8209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio)); 8210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) 8211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp); 8213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_parser->fill_aspect_ratio_info(&frame_info->aspectRatio); 8214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->nConcealedMacroblocks = num_conceal_mb; 8216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_info->nFrameRate = frame_rate; 8217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev print_debug_extradata(extra); 8218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra) 8221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL; 8223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE; 8224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nVersion.nVersion = OMX_SPEC_VERSION; 8225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 8226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef; 8227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 8228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data; 8229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *portDefn = m_port_def; 8230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u" 8231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "sliceheight = %u \n",portDefn->format.video.nFrameHeight, 8232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nFrameWidth, 8233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nStride, 8234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev portDefn->format.video.nSliceHeight); 8235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra) 8238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE); 8240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nVersion.nVersion = OMX_SPEC_VERSION; 8241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->eType = OMX_ExtraDataNone; 8242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->nDataSize = 0; 8243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra->data[0] = 0; 8244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev print_debug_extradata(extra); 8246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index) 8249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 8251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (index >= drv_ctx.ip_buf.actualcount) 8252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found"); 8254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_desc_buffer_ptr == NULL) 8257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_desc_buffer_ptr = (desc_buffer_hdr*) \ 8259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev calloc( (sizeof(desc_buffer_hdr)), 8260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf.actualcount); 8261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_desc_buffer_ptr == NULL) 8262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed "); 8264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8)); 8269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_desc_buffer_ptr[index].buf_addr == NULL) 8270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed "); 8272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 8273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 8276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset) 8279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries); 8281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_demux_entries < 8192) 8282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_offsets[m_demux_entries++] = address_offset; 8284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return; 8286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr) 8289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 bytes_to_parse = buf_hdr->nFilledLen; 8291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset; 8292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 index = 0; 8293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries = 0; 8295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while (index < bytes_to_parse) 8297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 8299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) || 8300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 8301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (buf[index+2] == 0x01)) ) 8302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //Found start code, insert address offset 8304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev insert_demux_addr_offset(index); 8305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buf[index+2] == 0x01) // 3 byte start code 8306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev index += 3; 8307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else //4 byte start code 8308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev index += 4; 8309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev index++; 8312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries); 8314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return; 8315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr) 8318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //fix this, handle 3 byte start code, vc1 terminator entry 8320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *p_demux_data = NULL; 8321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 desc_data = 0; 8322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 start_addr = 0; 8323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 nal_size = 0; 8324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 suffix_byte = 0; 8325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 demux_index = 0; 8326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 buffer_index = 0; 8327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (m_desc_buffer_ptr == NULL) 8329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries."); 8331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 8332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 8335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (buffer_index > drv_ctx.ip_buf.actualcount) 8336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%d)", buffer_index); 8338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 8339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr; 8342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ( ((OMX_U8*)p_demux_data == NULL) || 8344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) 8345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries."); 8347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 8348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (; demux_index < m_demux_entries; demux_index++) 8352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data = 0; 8354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev start_addr = m_demux_offsets[demux_index]; 8355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) 8356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3]; 8358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4]; 8362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (demux_index < (m_demux_entries - 1)) 8364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2; 8366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else 8368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2; 8370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)", 8372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev start_addr, 8373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev suffix_byte, 8374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_size, 8375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev demux_index); 8376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data = (start_addr >> 3) << 1; 8377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data |= (start_addr & 7) << 21; 8378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data |= suffix_byte << 24; 8379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 8381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32)); 8382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 8383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 8384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_demux_data += 16; 8386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (codec_type_parse == CODEC_TYPE_VC1) 8388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev { 8389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("VC1 terminator entry"); 8390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data = 0; 8391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev desc_data = 0x82 << 24; 8392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 8393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data + 4, 0, sizeof(OMX_U32)); 8394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 8395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 8396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev p_demux_data += 16; 8397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries++; 8398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //Add zero word to indicate end of descriptors 8400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(p_demux_data, 0, sizeof(OMX_U32)); 8401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32); 8403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size); 8404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 8406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_demux_entries = 0; 8407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Demux table complete!"); 8408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 8409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 0 8412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::createDivxDrmContext( OMX_PTR drmHandle ) 8413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE err = OMX_ErrorNone; 8415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( drmHandle == NULL ) { 8416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH("\n This clip is not DRM encrypted"); 8417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt = NULL; 8418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return err; 8419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt = DivXDrmDecrypt::Create( drmHandle ); 8422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (iDivXDrmDecrypt) { 8423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nCreated DIVX DRM, now calling Init"); 8424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE err = iDivXDrmDecrypt->Init(); 8425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(err!=OMX_ErrorNone) { 8426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR:iDivXDrmDecrypt->Init %d", err); 8427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete iDivXDrmDecrypt; 8428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev iDivXDrmDecrypt = NULL; 8429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else { 8432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM"); 8433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorUndefined; 8434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return err; 8436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 8438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8439