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